2017-10-19 80 views
2

为什么sameElements对集合返回true?集合不以任何顺序放置元素。在下面的两个例子中,第一个返回true,但第二个返回false。为什么sameElements对集合返回true?

scala> val xs1 = Set(3, 2, 1, 4, 5, 6, 7) 
xs1: scala.collection.immutable.Set[Int] = Set(5, 1, 6, 2, 7, 3, 4) 

scala> val ys1 = Set(7, 2, 1, 4, 5, 6, 3) 
ys1: scala.collection.immutable.Set[Int] = Set(5, 1, 6, 2, 7, 3, 4) 

scala> xs1 sameElements ys1 
res7: Boolean = true 


scala> val xt1 = Set(1, 2, 3) 
xt1: scala.collection.immutable.Set[Int] = Set(1, 2, 3) 

scala> val yt1 = Set(3, 2, 1) 
yt1: scala.collection.immutable.Set[Int] = Set(3, 2, 1) 

scala> xt1 sameElements yt1 
res8: Boolean = false 
+0

我会怀疑集合中元素的顺序不能保证与您在代码中定义的完全一致,因此可以应用内部逻辑和顺序变更。 – Pavel

回答

2

对于scala.collection.immutable.Set.sameElements(Set)返回true,两组需要有相同的元素,以相同的顺序

缺省的Set实现没有排序,所以元素的排序取决于存储算法和添加元素的顺序。在你的第一个例子中,排序结果纯粹是巧合。

如果您使用scala.collection.immutable.SortedSet代替,则应该得到您所期望的。

编辑:如果您只想检查两个集合是否包含相同的元素,无论顺序如何,只需使用equals。为了说明这一点,请尝试以下操作:

scala> val xt1 = Set(1, 2, 3) 
xt1: scala.collection.immutable.Set[Int] = Set(1, 2, 3) 

scala> val yt1 = Set(3, 2, 1) 
yt1: scala.collection.immutable.Set[Int] = Set(3, 2, 1) 

scala> xt1 sameElements yt1 
res0: Boolean = false 

scala> xt1 == yt1 
res1: Boolean = true 

,如果你需要确定排序是否相同,以及元素本身那么sameElements是有用的;否则,只需使用好的ole ==

+0

这不适合我。集合不是有序的,所以顺序不应该依赖于任何东西 - 它不应该在任何语义上存在。也就是说,包含相同元素的两个集合应该彼此不可区分,而不管元素的添加顺序如何。请注意,大多数Set实现都是这种情况,而不是特殊情况(通过Set.Set4设置'Set.Set2')。我认为这是这些类中的一个错误。 – sepp2k

+1

@ sepp2k不管你的感受如何。 :-)重要的是[该函数的文档状态](http://www.scala-lang.org/api/current/scala/collection/mutable/Set.html):“检查其他可迭代集合是否包含与这组相同的元素具有相同的顺序。“ –

+1

如果你想检查它们是否包含相同的元素,你可以使用'=='。 (例如,在OP的原始文章中,如果您键入'xt1 == yt1',那么您会得到什么?) –

相关问题