简单的问题。
我有一个新列表和一个旧列表。在Java中是否有标准的方法/库,允许我比较这两个列表并确定哪些项目已更新/删除或是全新的?例如。我应该最终得到三个列表 - 已删除的项目(旧的但不是新的项目),更新的项目(两者中的项目),新项目(新项目,而不是旧项目)。
我可以自己写这篇文章,但想知道是否有标准的方法来做到这一点。
列表中的对象实现正确。
答案 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是至少值得一提!)