Удалить не совпадения из двух ListProperty - PullRequest
0 голосов
/ 01 марта 2020

Моя цель: получить два «идентичных» списка, удалив несовпадающие объекты из обоих за меньшее время.

Что я достиг: Два идентичных списка, удалив несоответствия, но требует слишком длинный.

Моя проблема:

У меня есть два больших списка (по 800 тыс. записей в каждом), эти списки заполнены объектами (HashCode и Equals правильно реализованы на этих объектах), и мне нужно удалить несовпадающие записи в обоих списках. Это может быть только 3-100 записей (ничто по сравнению с 800k регистрами).

Проблема в основном в производительности, потому что на выполнение операции уходит более 10 минут.

Вот что я пробовал:

  • retainAll : это работает, но занимает слишком много времени

  • Использование HashSet.retainAll: Невозможно использовать наборы в моих списках. Это занимает несколько секунд, прекрасно работает, но мне нужны дубликаты

  • Вручную: один за другим из списка 1, глядя в список 2, без сохранения совпадений в третьем списке, повторите операцию в обратном порядке в 4-м list, затем с помощью removeAll с обоими списками.

  • Итераторы: выглядело как хорошая идея копировать списки, удалять совпадения из обоих скопированных списков, таким образом, у меня меньше элементов каждый l oop , и мне нужно найти только один раз, потому что остатки не случайно. Наконец, используйте removeAll, чтобы удалить несоответствия из исходных списков, но все равно занимает + -10 минут.

Мне нужно найти более быстрый способ сделать это, но не могу понять это.

О дубликатах: Звучит странно, но для моей программы 2 объекта равны, если имеют одинаковое «имя», но могут иметь другие значения в других нужных мне атрибутах.

1 Ответ

0 голосов
/ 01 марта 2020

Не понимая всех причин, по которым у вас есть равенство в имени, но не в значениях ... или даже как вы определяете, есть ли в списке A "foo", а в списке B - 2x "foo", если вы хотите сохранить все " foo "...

Вот идея .. Сделать HashSet" name "для массива объектов с тем же именем ... теперь вы можете использовать retainAll, а затем быстро восстановить исходную коллекцию из хэш-набора значения.

...