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.
精彩评论