Существует ли метод 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(_))
Есть ли что-то более сжатое, чем приведенное выше, для сравнения?
Ответы
Ответ 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.