반응형
스칼라 세트는 동일한 요소를 포함하지만 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)
해야 하지만 반복기가 다르므로 sameElements
false를 반환합니다.
이 동작은 놀랍고 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)
반응형
'IT이야기' 카테고리의 다른 글
CSS 블록의 마지막 세미콜론 제외 (0) | 2021.04.17 |
---|---|
Node.js“심각한 오류 : JS 할당 실패-프로세스 메모리 부족”— 스택 추적 (0) | 2021.04.17 |
Python Sound ( "Bell") (0) | 2021.04.17 |
C # 음성 인식 (0) | 2021.04.17 |
Linux 디렉터리 목록에 있는 물음표 (0) | 2021.04.16 |