Есть ли реализация retainAll () с пользовательскими компараторами? - PullRequest
4 голосов
/ 17 октября 2011

Мне нужно просеять Коллекции в соответствии с содержанием других Коллекций.Обычно я бы использовал метод Collection.retainAll().

К сожалению, равенство объектов домена, с которыми я работаю, довольно изменчиво, в зависимости от контекста сравнения.Таким образом, я не могу положиться на equals/hashCode.

Моим следующим рефлексом было использование пользовательского Comparator, но я не смог найти никаких методов, поддерживающих то, что я имел в виду.Реализация функциональности не является проблемой, но я чувствую, что изобретаю колесо здесь.

Я что-то пропустил в API?Другие структуры (не слишком эзотерические), такие как общие, тоже приветствуются.
И если нет, то какие оптимизации могли бы сделать мой простой вывод (создание списка всех объектов внутри обеих коллекций путем просмотра всех элементов обеих коллекций в n ^ 2)хороший?

Ответы [ 3 ]

3 голосов
/ 17 октября 2011

Предложить использование Фильтр Гуавы .Альтернатива - бросить свой собственный retainAllBy(sourceCollection, Comparator).

1 голос
/ 17 октября 2011

Гуава имеет громоздкое решение этой проблемы, концепцию Equivalence. Вы оборачиваете свои объекты в эквивалентность, используя Equivalence.wrap(), сохраняете свернутые версии в коллекциях и тем самым заставляете коллекции использовать свою собственную логику equals / hashcode.

Я (и другие) запросил Наборы и карты, основанные на эквивалентности , но, к сожалению, команда Guava предлагает вместо этого использовать вышеуказанный маршрут.

1 голос
/ 17 октября 2011

Я что-то пропустил в API?

В Java Collection Framework нет ничего, что делает retainAll чем-то еще, кроме стандартной реализации equals.


Сильно в зависимости от вашего варианта использования вы можете сделать это следующим образом:

Создайте объект-обертку, который можно обернуть вокруг ваших объектов, но с помощью необходимого вам метода equals. А затем используйте эти обертки для выполнения retainAll, после чего вам необходимо развернуть объекты из результирующей коллекции.

Но у этого пути есть два недостатка:

  • будет создано множество объектов
  • работает правильно, только если equals метод оболочки по-прежнему является допустимым методом equals в терминах java doc для методов equals .
...