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

Зависит от информации, которую Вы хотите к дорожке времени. В одной компании мы должны были только отследить наши общие рабочие времена день (цель налога/социального страхования). easieast решение было: last. Более детализированный Вы могли просто сделать что-то как

echo -e -n `date`\tProjectName\tTask\tComment >> MyTimeTable.txt
...whatever...
echo -e \t`date` >> MyTimeTable.txt

и procsessing с обычными подозреваемыми (grep, awk...).

, Когда Вам нужно еще больше функциональности, я не знаю никого, который работает без gui.

15
задан PhiLho 3 November 2009 в 14:04
поделиться

6 ответов

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

List<T> oldList = ...
List<T> newList= ...

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

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

List<T> added = new ArrayList<T>(newList);
added.removeAll(oldList);
34
ответ дан 1 December 2019 в 00:23
поделиться

В стандартных библиотеках ничего нет.

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

Collection<T> old = ...;
Collection<T> neww = ...;

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

(Вам понадобится (не отмечено) приводит к приведению, поскольку CollectionUtils не генерируется.)

9
ответ дан 1 December 2019 в 00:23
поделиться

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

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

3
ответ дан 1 December 2019 в 00:23
поделиться

Personally, I believe that the only sensible way to explain the difference between two lists is with a full-blown diff algorithm (like that of the unix diff command).

Sets, though, are a much simpler story. Google Collections provides a Sets.difference(Set, Set) method, as well as union and intersection.

2
ответ дан 1 December 2019 в 00:23
поделиться

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

keepAll (Collection c)

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

removeAll (Collection c)

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

1
ответ дан 1 December 2019 в 00:23
поделиться

Если есть стандартный способ, я его не знаю ...
Я просмотрел Коллекции , но увидел только disjoint () (это уже информация ...) и indexOfSubList () (не уверен, что это вообще полезно).
Я также посмотрел на Google Collections , и если там, по-видимому, нет такой возможности, там есть несколько полезных инструментов, например, функция filter () Collections2 , которая может помочь, если вы сделаете правильный предикат.

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

0
ответ дан 1 December 2019 в 00:23
поделиться
Другие вопросы по тегам:

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