Сравните два списка для обновлений, удалений и дополнений

Простой вопрос

У меня есть новый список и старый список. В Java есть стандартный способ / библиотека, которая позволяет мне сравнивать эти два списка и определять, какие элементы были обновлены / удалены или являются совершенно новыми? Например. Я должен закончить с тремя списками - Удаленные элементы (элементы в старом, но не в новом), Обновленные элементы (элементы в обоих), Новые элементы (элементы в новом и не в старом).

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

Объекты в списке соответствуют правильно.

 Pablojim04 нояб. 2009 г., 14:12
Пока метод равных реализован, я нене понимаю, почему порядок должен влиять на removeAll и т. д.t предложить в javadoc: удаляет из этого списка все элементы, которые содержатся в указанной коллекции (необязательная операция).
 Adamski03 нояб. 2009 г., 15:53
Вы обеспокоены порядком списка? Например, решения, предложенные до сих пор с использованием retainAll / removeAll, не будут иметь дело с ситуацией, когда новый список содержит те же элементы, что и старый список, хотя и в другом порядке; например {»фу ","бар"} против {"бар", "Foo»}.

Ответы на вопрос(6)

Лично я считаю, что единственный разумный способ объяснить разницу между двумясписки с полнофункциональным алгоритмом сравнения (например, с помощью команды unix diff).

наборыТем не менее, это гораздо более простая история. Google Collections предоставляетSets.difference (Установить, Установить) метод, а также объединение и пересечение.

Решение Вопроса

Нет стандартного способа извините. Вы можете сделать это довольно легко со стандартным JDK, не прибегая к добавлению зависимости от Apache Commons (как предлагали другие). Предполагая, что ваши спискиList экземпляры:

List oldList = ...
List newList= ...

List removed = new ArrayList(oldList);
removed.removeAll(newList);

List same = new ArrayList(oldList);
same.retainAll(newList);

List added = new ArrayList(newList);
added.removeAll(oldList);
 Andrzej Doyle03 нояб. 2009 г., 15:25
+1 - да, намного лучше моего.
 Pablojim04 нояб. 2009 г., 14:21
К сожалению, это немного неправильно ... removeAll и аналогичные работают с переданным в списке и возвращают логическое значение. Так что победилт компилировать. Должен быть: Список <T> добавлен = новый ArrayList <T>(NewList); added.removeAll (oldList); и т.д ... Так что, в конце концов, может быть дело в методах apache commons ...
 cletus04 нояб. 2009 г., 14:53
@Pablojim: совершенно верно, спасибо. Исправлена.

Я думаю, что вы можете сделать это с помощью стандартной библиотеки Java тоже. Взгляните на следующие методы java.util.Collection:

retainAll (коллекция c)

Сохраняет только элементы в этой коллекции, которые содержатся в указанной коллекции (необязательная операция). Другими словами, удаляет из этой коллекции все ее элементы, которые не содержатся в указанной коллекции.

removeAll (Коллекция c)

Удаляет всю эту коллекциюs элементы, которые также содержатся в указанной коллекции (необязательная операция). После возврата этого вызова эта коллекция не будет содержать общих элементов с указанной коллекцией.

Там'в стандартных библиотеках ничего нет.

Однако Apache CommonsCollectionUtils Класс предоставляет вам эту функциональность с помощью методов пересечения и вычитания:

Collection old = ...;
Collection neww = ...;

Collection deleted = (Collection)CollectionUtils.subtract(old, new);
Collection updated = (Collection)CollectionUtils.intersection(old, new);
Collection newResult = (Collection)CollectionUtils.subtract(new, old);

(Вам нужно (не проверено) приведение, потому что CollectionUtils нет обобщенный.)

Если есть стандартный способ, я нене знаю это ...

я смотрел наКоллекции но видел только дизъюнкт ()Это уже информация ...) и indexOfSubList () (не уверен, полезен ли он вообще).

Я также посмотрел наКоллекции Google и если там, по-видимому, нет такой возможности, то есть некоторые полезные инструменты, такие какCollections2'Функция filter (), которая может помочь, если вы сделаете правильный предикат.

[EDIT] Я пропустил методы removeAll и retainAll из коллекции ... Я неУдалить этот ответ, даже если он немного пафосный, поскольку он как-то дополняет другие ответы ... (я думаю, что Google Коллекции, по крайней мере, стоит упомянуть!)

я хотел бы использоватьApache CollectionUtils и используйте функции объединения (элементы в обеих) и дизъюнкции (измените порядок, чтобы получить одну или другую).

В идеале тысделать один проход по всем элементам вместо 3, но если это нея бы не сталсейчас не беспокоюсь об эффективности.

Ваш ответ на вопрос