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

时间:2010-09-01 23:44:14

标签: scala equality

假设:

val l1 = List(1,2,3) 
val l2 = List(2,3,1)

我想要一种确认l1等于l2的方法(如同内容但顺序不同)。 List / Seq上是否有API方法来执行此操作?

l1.sameElements(l2)

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

我想出了以下内容:

l1.foldLeft(l1.size == l2.size)(_ && l2.contains(_))

有没有比上面更简洁的方法进行比较?

2 个答案:

答案 0 :(得分:36)

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

l1.toSet == l2.toSet

如果你想要的是“这些列表包含相同的元素,每个列表的重复次数相同”:

l1.sorted == l2.sorted

如果您想要的是“这些列表包含相同的元素且大小相同,但给定元素的重复次数可能因两个列表而异”:

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

答案 1 :(得分:10)

虽然

l1.sorted == l2.sorted

是正确的,因为排序,它的运行时性能是O(n log n)。对于大型列表,您可能更适合

l1.groupBy(identity) == l2.groupBy(identity)

应该是O(n),假设groupBy的执行得体。