Scala 为什么对于集合,sameElements返回true?

Scala 为什么对于集合,sameElements返回true?,scala,Scala,为什么集合的相同元素返回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.immuta

为什么集合的相同元素返回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

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

默认的
Set
实现没有顺序,因此元素顺序取决于存储算法和元素添加的顺序。在您的第一个示例中,顺序完全是巧合造成的

如果改用
scala.collection.immutable.SortedSet
,您应该得到您期望的结果

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


因此,如果您需要确定排序是否与元素本身相同,那么
sameElements
非常有用;否则,只需使用好的ole
=

我会怀疑集合中元素的顺序不能保证与代码中定义的完全一致,因此可以应用内部逻辑和顺序更改。我觉得这可能是重复的。集合是没有顺序的,所以顺序不应该依赖于任何东西——它在语义上根本不应该存在。也就是说,包含相同元素的两个集合应该彼此不可区分,无论元素是按哪个顺序添加的。请注意,大多数Set实现都是这种情况,而不是特殊情况下的实现(
Set.Set2
Set.Set4
)。我认为这是这些类中的一个bug。@重要的是:“检查其他iterable集合是否包含与此集合相同顺序的相同元素。”如果要检查它们是否包含相同的元素,可以使用
==
。(例如,在OP的原始帖子中,如果您键入
xt1==yt1
,您会得到什么?)我不想检查两个集合是否相同。看到这种行为我很惊讶。在我看来,根据你的回答,使用
sameElements
表示
Set
是不可靠的。@ManuChadha我同意
sameElements
可能有点用词不当,因为对这个名称的含义有两种不同的解释。但是,如果要检查两个集合是否包含相同的元素,请使用
equals
==
(检查两个集合是否相等)。如果顺序很重要,而且经常如此,
等于
是不够的,因此需要
相同的元素
。相同的元素是可靠的,但只有当您了解它的作用时。如果您想要有序的集合,请使用
SortedSet
TreeSet
实现。
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