java—比较两个列表的更新、删除和添加

6yoyoihd  于 2021-07-05  发布在  Java
关注(0)|答案(6)|浏览(949)

简单的问题。
我有一张新单子和一张旧单子。在java中,有没有一个标准的方法/库允许我比较这两个列表,并确定哪些项目已经更新/删除或者是全新的?e、 g.我应该有三个列表-删除的项目(旧项目但不在新项目中)、更新的项目(两个项目中的项目)、新项目(新项目和不在旧项目中的项目)。
我可以自己写,但不知道是否有一个标准的方法来做这件事。
列表中的对象正确地实现了equals。

5ssjco0h

5ssjco0h1#

标准图书馆里什么都没有。
不过,apache commons collectionutils类通过intersection和subtract方法提供了以下功能:

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没有被泛化。)

o75abkj4

o75abkj42#

没有标准的方法对不起。不过,使用标准jdk可以相当轻松地完成这项工作,而无需添加对apachecommons的依赖(正如其他人所建议的那样)。假设你的名单是 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);
368yc8dk

368yc8dk3#

我个人认为,解释两个列表之间差异的唯一合理方法是使用一个完整的diff算法(比如unix diff命令)。
不过,布景的故事要简单得多。googlecollections提供了set.difference(set,set)方法,以及并集和交集。

z18hc3ub

z18hc3ub4#

如果有一个标准的方法,我不知道。。。
我查看了集合,但只看到disjoint()(这已经是一个信息……)和indexofpublist()(不确定它是否有用)。
我还研究了googlecollections,如果显然没有这样的工具,那么这里有一些有用的工具,比如collections2的filter()函数,如果你做了一个正确的 predicate ,它会有所帮助。
[编辑]我错过了删除和保留收集方法。。。我不删除这个答案,即使有点可怜,因为它是其他答案的补充(我认为谷歌收藏至少值得一提!)

vyswwuz2

vyswwuz25#

我将使用apachecollectionutils并使用union(两个函数中的项)和disjunction函数(更改顺序以获得其中一个)。
理想情况下,你会让一个通过所有的元素,而不是3,但如果这不是你的瓶颈,我不会担心效率现在。

eanckbw9

eanckbw96#

我认为您也可以通过标准java库来实现这一点。请看java.util.collection的以下方法:
保留(集合c)
仅保留此集合中包含在指定集合中的元素(可选操作)。换句话说,从该集合中删除指定集合中不包含的所有元素。
removeall(集合c)
删除指定集合中也包含的此集合的所有元素(可选操作)。此调用返回后,此集合将不包含与指定集合公用的元素。

相关问题