是否有一种API方法可以比较Seq的内容而不管顺序如何?

ssa*_*anj 24 scala equality

假设:

val l1 = List(1,2,3) 
val l2 = List(2,3,1)
Run Code Online (Sandbox Code Playgroud)

我想,确认L1等于L2(如在相同的内容,但不同的顺序)的方法.List/Seq上是否有API方法来执行此操作?

l1.sameElements(l2)
Run Code Online (Sandbox Code Playgroud)

不起作用,因为它也验证订单.

我想出了以下内容:

l1.foldLeft(l1.size == l2.size)(_ && l2.contains(_))
Run Code Online (Sandbox Code Playgroud)

有没有比上面更简洁的做这个比较?

Tom*_*ett 41

如果您想要的是"这些列表包含相同的元素,无论顺序或重复":

l1.toSet == l2.toSet

如果你想要的是"这些列表包含相同的元素,并且每个列表具有相同的重复次数":

l1.sorted == l2.sorted

如果你想要的是"这些列表包含相同的元素并且大小相同,但是给定元素的重复次数可以在两个列表之间不同":

l1.size == l2.size && l1.toSet == l2.toSet


Dav*_*ith 10

l1.sorted == l2.sorted
Run Code Online (Sandbox Code Playgroud)

是正确的,由于排序,它的运行时性能是O(n log n).对于大型列表,您可能会更好

l1.groupBy(identity) == l2.groupBy(identity)
Run Code Online (Sandbox Code Playgroud)

应该是O(n),假设groupBy的一个不错的实现.