开发者

Is there an API method that compares contents of a Seq irrespective of order?

Assuming:

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

I want a method that confirms 开发者_Python百科that l1 is equal to l2 (as in same contents but different order). Is there an API method on List/Seq to do this?

l1.sameElements(l2)

does not work as it verifies order as well.

I've come up with the following:

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

Is there anything more succinct than the above to do this comparison?


If what you want is "these lists contain the same elements, irrespective of order or repetitions":

l1.toSet == l2.toSet

If what you want is "these lists contain the same elements, and with the same number of repetitions of each":

l1.sorted == l2.sorted

If what you want is "these lists contain the same elements and are the same size, but the number of repetitions of a given element can differ between the two lists":

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


While

l1.sorted == l2.sorted

is correct, it's runtime performance is O(n log n), because of the sorting. For large lists, you are probably better with

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

which should be O(n), assuming a decent implementation of groupBy.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜