Scala 集合库为少于 5 个值的 Sets 提供了专门的实现(请参阅source https://github.com/scala/scala/blob/v2.11.4/src/library/scala/collection/immutable/Set.scala#L1)。这些实现的迭代器返回元素按照添加顺序,而不是用于较大集合的一致的、基于哈希的排序。
此外,sameElements
(scaladoc http://www.scala-lang.org/api/2.11.5/index.html#scala.collection.Iterable@sameElements%28that:scala.collection.GenIterable%5BA%5D%29:Boolean) 定义于Iterable
s(它是在IterableLike
- 参见source https://github.com/scala/scala/blob/v2.11.5/src/library/scala/collection/IterableLike.scala#L1);仅当迭代器以相同顺序返回相同元素时,它才返回 true。
所以虽然Set(1,2,3)
and Set(3,2,1)
ought为了等价,它们的迭代器是不同的,因此sameElements
返回假。
这种行为令人惊讶,并且可以说是一个错误,因为它违反了 Set 的数学期望(但仅限于 Set 的某些大小!)。
正如 I.K.在评论中指出,==
如果您只是将集合彼此进行比较,则效果很好,即Set(1,2,3) == Set(3,2,1)
。然而,sameElements 更通用,因为它可以比较任意两个可迭代的元素。例如,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)
I have 提交了修复 https://github.com/47deg/scala-exercises/issues/18为了斯卡拉练习 http://scala-exercises.47deg.com/koans#iterables这解释了sameElements
问题。