比较两个列表以进行更新,删除和添加

时间:2009-11-03 13:59:46

标签: java collections

简单的问题。

我有一个新列表和一个旧列表。在Java中是否有标准的方法/库,允许我比较这两个列表并确定哪些项目已更新/删除或是全新的?例如。我应该最终得到三个列表 - 已删除的项目(旧的但不是新的项目),更新的项目(两者中的项目),新项目(新项目,而不是旧项目)。

我可以自己写这篇文章,但想知道是否有标准的方法来做到这一点。

列表中的对象实现正确。

6 个答案:

答案 0 :(得分:34)

没有标准方式抱歉。您可以使用标准JDK轻松地完成它,而无需依赖于Apache Commons(正如其他人所建议的那样)。假设您的列表是List<T>个实例:

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);

答案 1 :(得分:8)

标准库中没有任何内容。

然而,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未被广泛化。)

答案 2 :(得分:3)

我会使用Apache CollectionUtils并使用union(两者中的项)和析取函数(更改顺序以获取其中一个)。

理想情况下,你可以通过所有元素而不是3,但如果这不是你的瓶颈,我现在不会担心效率。

答案 3 :(得分:2)

就个人而言,我认为解释两个列表之间差异的唯一合理方法是使用完整的diff算法(类似于unix diff命令)。

不过,

是一个更简单的故事。 Google Collections提供了Sets.difference(Set, Set)方法,以及union和intersection。

答案 4 :(得分:1)

我认为您也可以使用标准的Java库来实现这一目标。看一下java.util.Collection的以下方法:

retainAll(Collection c)

  

仅保留此中的元素   包含在中的集合   指定集合(可选   操作)。换句话说,删除   从这个集合的所有   未包含在内的元素   指定的集合。

removeAll(Collection c)

  

删除所有此集合的元素   也包含在   指定集合(可选   操作)。此调用返回后,   这个系列将不包含   与指定的共同元素   集合。

答案 5 :(得分:0)

如果有标准的方法,我不知道...
我看了Collections,但只看到了disjoint()(这已经是一个信息......)和indexOfSubList()(不确定它是否有用)。
我还查看了Google Collections,如果显然没有这样的工具,那里有一些有用的工具,比如Collections2的filter()函数,如果你做了一个正确的谓词,它会有所帮助。 / p>

[编辑]我错过了removeAll和retainAll方法的收集...我不删除这个答案,即使有点可怜,因为它在某种程度上是对其他答案的补充......(我认为Google Collections是至少值得一提!)