Подтвердить что ты не робот

Существует ли метод API, который сравнивает содержимое Seq независимо от порядка?

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

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

Мне нужен метод, который подтверждает, что l1 равно l2 (как в том же содержимом, но в другом порядке). Есть ли метод API в List/Seq для этого?

l1.sameElements(l2)

не работает, так как он также проверяет порядок.

Я придумал следующее:

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

Есть ли что-то более сжатое, чем приведенное выше, для сравнения?

4b9b3361

Ответ 1

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

l1.toSet == l2.toSet

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

l1.sorted == l2.sorted

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

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

Ответ 2

Пока

l1.sorted == l2.sorted

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

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

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