Есть ли метод API, который сравнивает содержимое Seq независимо от порядка? - PullRequest
23 голосов
/ 02 сентября 2010

Предполагается:

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 ]

37 голосов
/ 02 сентября 2010

Если вы хотите, чтобы «эти списки содержали одни и те же элементы, независимо от порядка или повторений»:

l1.toSet == l2.toSet

Если вы хотите, чтобы эти списки содержали одинаковые элементыи с одинаковым количеством повторений каждого ":

l1.sorted == l2.sorted

Если то, что вы хотите", эти списки содержат одинаковые элементы и имеют одинаковый размер, но количество повторенийданного элемента может отличаться между двумя списками ":

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

10 голосов
/ 02 сентября 2010

Пока

l1.sorted == l2.sorted

правильно, производительность во время выполнения равна O (n log n) из-за сортировки. Для больших списков вы, вероятно, лучше с

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

, который должен быть O (n), при условии достойной реализации groupBy.

...