Есть ли способ проверить, содержат ли две коллекции одни и те же элементы, независимо от порядка?
Я искал метод, который работает как Arrays.equals(a1, a2)
, но игнорирует порядок элементов. Я не смог найти его в Google Collections (что-то вроде Iterables.elementsEqual()
, но это учетная запись для заказа), а JUnit (assertEquals()
, очевидно, просто вызывает equals()
в коллекции, которая зависит от реализации Collection, и это не то, что я хочу)
Было бы лучше, если бы такой метод принимал Iterable
s, но я тоже прекрасно разбираюсь в том, что вы принимаете Collection
s
Разумеется, такой метод учитывает любые повторяющиеся элементы в коллекции (поэтому он не может просто проверить на containsAll()
).
Обратите внимание, что я не спрашиваю, как реализовать такую вещь, мне просто интересно, есть ли в ней библиотека стандартных коллекций.
Ответы
Ответ 1
В коллекциях коллекций Apache есть CollectionUtils # isEqualCollection:
Возвращает true, если данные коллекции содержат точно такие же элементы с точно такой же мощностью.
То есть, если мощность e в равна мощности e в b, для каждого элемента e в или b.
Что, я думаю, именно то, что вам нужно.
Ответ 2
Это три вызова метода и использует Коллекции Google Guava, но, возможно, так же просто, как и
HashMultiset.create(c1).equals(HashMultiset.create(c2));
Создание временного Multiset
может показаться расточительным, но для эффективного сравнения коллекций вам нужно как-то их индексировать.
Ответ 3
Если вы хотите игнорировать порядок, то как насчет наборов тестов для равенства?
new HashSet(c1).equals(new HashSet(c2))