복붙노트

[SCALA] 스칼라 세트 같은 요소를 포함하지만, sameElements ()는 false를 돌려줍니다

SCALA

스칼라 세트 같은 요소를 포함하지만, sameElements ()는 false를 돌려줍니다

반복 가능 객체에 스칼라 연습을 통해 작업하는 동안, 나는 다음과 같은 이상한 행동을 발견 :

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?!

분명히 이러한 설정은 동일한 요소를 가지고 있고, 순서를 무시한다 왜이 작업은 더 큰 세트에 대한 예상 않는?

해결법

  1. ==============================

    1.스칼라 컬렉션 라이브러리는 5 개 미만의 값 (소스 참조)의 설정에 대한 전문적인 구현을 제공합니다. 이러한 구현의 반복자는 오히려 더 큰 설정에 사용되는 일관 해시 기반 주문보다 추가 된 순서의 요소를 돌려줍니다.

    스칼라 컬렉션 라이브러리는 5 개 미만의 값 (소스 참조)의 설정에 대한 전문적인 구현을 제공합니다. 이러한 구현의 반복자는 오히려 더 큰 설정에 사용되는 일관 해시 기반 주문보다 추가 된 순서의 요소를 돌려줍니다.

    또한 sameElements (scaladoc)는 반복 가능 객체 (이 IterableLike에서 구현 - 소스 참조)에 대해 정의된다; 반복자는 같은 순서로 같은 요소를 반환 할 경우에만 true를 반환합니다.

    세트 (1,2,3)과 세트 (3,2,1)에 해당되어야한다하지만 그래서, 그 반복자는, 따라서 sameElements 반환 거짓 다릅니다.

    이 세트의 수학적 기대를 위반하기 때문에이 문제는 (만 세트의 특정 크기!) 틀림없이 버그를 놀라게하고있다.

    로 I.K. 당신은 그냥 서로 설정 == 즉 세트 (1,2,3) (3,2,1)을 설정을 비교하는 경우 코멘트에 밖으로 점, == 잘 작동합니다. 그러나 sameElements는 두 반복 가능 객체의 요소를 비교할 수 있다는 점에서 더 일반적이다. 예를 들어,리스트 (1, 2, 3) == 어레이 (1, 2, 3)는 거짓이지만,리스트 (1, 2, 3) sameElements 어레이 (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 문제를 설명하는 스칼라 운동에 대한 수정을 제출했다.

  2. from https://stackoverflow.com/questions/29008500/scala-sets-contain-the-same-elements-but-sameelements-returns-false by cc-by-sa and MIT license