IT이야기

스칼라 세트는 동일한 요소를 포함하지만 sameElements ()는 false를 리턴합니다.

cyworld 2021. 4. 17. 10:33
반응형

스칼라 세트는 동일한 요소를 포함하지만 sameElements ()는 false를 리턴합니다.


Iterables에 대한 Scala 연습을 진행하는 동안 다음과 같은 이상한 동작이 발생했습니다.

val xs = Set(5,4,3,2,1)
val ys = Set(1,2,3,4,5)
xs sameElements ys       // true

val xs = Set(3,2,1)
val ys = Set(1,2,3)
xs sameElements ys       // false - WAT?!

확실히 이러한 세트는 동일한 요소를 가지며 순서를 무시해야합니다. 왜 이것이 더 큰 세트에 대해서만 예상대로 작동합니까?


Scala 컬렉션 라이브러리는 값이 5 개 미만인 집합에 대한 특수 구현을 제공합니다 ( 소스 참조 ). 이러한 구현의 반복기는 더 큰 집합에 사용되는 일관된 해시 기반 순서가 아니라 추가 된 순서대로 요소 반환합니다 .

또한, sameElements( scaladoc가 )에 정의 Iterable들 (이 구현된다 IterableLike- 투시 소스 ); 반복자가 동일한 순서로 동일한 요소를 반환하는 경우에만 true를 반환합니다.

따라서 Set(1,2,3)동일 Set(3,2,1) 해야 하지만 반복기가 다르므로 sameElementsfalse를 반환합니다.

이 동작은 놀랍고 Set에 대한 수학적 기대치를 위반하기 때문에 틀림없이 버그입니다 (하지만 특정 크기의 Set에만 해당됩니다!).

IK가 주석에서 지적했듯이 ==세트를 서로 비교하는 경우, 즉 Set(1,2,3) == Set(3,2,1). 그러나 sameElements는 두 iterable의 요소를 비교할 수 있다는 점에서 더 일반적입니다. 예를 들어 List(1, 2, 3) == Array(1, 2, 3)는 거짓이지만 List(1, 2, 3) sameElements Array(1, 2, 3)참입니다.

보다 일반적으로 평등은 혼란 스러울 수 있습니다.

List(1,2,3) == Vector(1,2,3)
List(1,2,3) != Set(1,2,3)
List(1,2,3) != Array(1,2,3)      
Array(1,2,3) != Array(1,2,3)

나는 한 수정을 제출 에 대한 스칼라 운동 설명하고 sameElements문제를.

참조 URL : https://stackoverflow.com/questions/29008500/scala-sets-contain-the-same-elements-but-sameelements-returns-false

반응형