Проблема с реализацией removeAll для Списка пользовательского объекта

У меня есть сценарий в моем коде, где я должен сравнить два Списка и удалить из первого списка, объекты, которые присутствуют во втором списке. Сродни тому, как "removeAll" возражают работам для Списка. Так как мой Список создается на пользовательском объекте, removeAll метод не будет работать на меня.

Я попробовал различные методы для создания этой работы: - реализованный равняется (), и хэш-код для пользовательского объекта, включающего список - реализовал Сопоставимый Интерфейс для пользовательского объекта - реализовал Интерфейс Компаратора для пользовательского объекта

Я даже попытался использовать Common Apache CollectionUtils, и методы ListUtils (вычтите, пересекитесь, removeAll). Ни один, кажется, не работает.

Я понимаю, что должен буду, возможно, написать некоторый пользовательский код удаления. Но не уверенный, как пойти о выполнении этого. Любые указатели, помогающие мне перемещаться в правильное направление, будут действительно цениться.

Спасибо, сойка

6
задан Jay 11 April 2010 в 14:36
поделиться

3 ответа

Вы сказали:

... Поскольку мой List создан на пользовательском объекте, метод removeAll не будет работать для меня.

Как отмечали другие, метод .removeAll() должен работать в описанном вами сценарии даже для пользовательских объектов, если только пользовательские объекты подчиняются контрактам, которые Java Collections ожидает от своих объектов, включая правильно реализованные методы equals() и hashCode().

Я пробовал различные методы, чтобы заставить это работать: - реализовал equals() и hashCode для пользовательского объекта, составляющего список - реализовал интерфейс Comparable для пользовательского объекта - реализовал интерфейс Comparator для пользовательского объекта ...

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

Поскольку большинство людей согласны с тем, что первый подход (.removeall()) должен сработать, и поскольку задействованы пользовательские объекты, почему бы не просмотреть этот вопрос на StackOverflow, чтобы увидеть, не выскочит ли что-нибудь из него:

Переопределение equals и hashCode в Java

"Какие вопросы / подводные камни мне нужно учитывать при переопределении equals и hashCode в классе java? "

4
ответ дан 8 December 2019 в 04:51
поделиться

Коллекции Java уже подходят для вашего сценария. Вызовите Collection.removeAll (Collection) , и он удалит все элементы из переданной в коллекции, используя метод equals () для проверки равенства.

List<String> list1 = new ArrayList<String>();
Collections.addAll(list1, "one", "two", "three", "four");
List<String> list2 = new ArrayList<String>();
Collections.addAll(list2, "three", "four", "five");
list1.removeAll(list2); // now contains "one", "two"

Чтобы эта работа работала, сохраняемые вами объекты просто должны правильно реализовать контракт equals / hashCode, который: для любых двух объектов a и b :

a.equals(b) == b.equals(a)

и:

a.hashCode() == b.hashCode() if a.equals(b)

Неправильно определенные методы equals и hashCode создают неопределенное поведение и являются частой причиной проблем, связанных с коллекциями.

14
ответ дан 8 December 2019 в 04:51
поделиться

Переопределения методов equals и hashCode достаточно, чтобы метод removeAll работал на пользовательских объектах.

Скорее всего, вы не переопределили их должным образом. Некоторый код нам очень поможет.

6
ответ дан 8 December 2019 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: