为什么sameElements对集合返回true?

时间:2017-10-19 10:40:56

标签: scala

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

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

1 个答案:

答案 0 :(得分: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是有用的;否则,只需使用好的==