Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 比较两个列表的更新、删除和添加_Java_Collections - Fatal编程技术网

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

Java 比较两个列表的更新、删除和添加,java,collections,Java,Collections,简单的问题 我有一张新名单和一张旧名单。在Java中,是否有一个标准的方法/库允许我比较这两个列表,并确定哪些项目已被更新/删除或是全新的?例如,我应该以三个列表结束-删除的项目(旧项目但不在新项目中)、更新的项目(两个项目中的项目)、新项目(新项目和不在旧项目中的项目) 我可以自己写,但想知道是否有一个标准的方法来做 列表中的对象正确地实现了equals。我将使用并使用并集(两者中的项)和析取函数(更改顺序以获得其中一个) 理想情况下,您可以对所有元素进行一次遍历,而不是3次,但如果这不是您的

简单的问题

我有一张新名单和一张旧名单。在Java中,是否有一个标准的方法/库允许我比较这两个列表,并确定哪些项目已被更新/删除或是全新的?例如,我应该以三个列表结束-删除的项目(旧项目但不在新项目中)、更新的项目(两个项目中的项目)、新项目(新项目和不在旧项目中的项目)

我可以自己写,但想知道是否有一个标准的方法来做

列表中的对象正确地实现了equals。

我将使用并使用并集(两者中的项)和析取函数(更改顺序以获得其中一个)


理想情况下,您可以对所有元素进行一次遍历,而不是3次,但如果这不是您的瓶颈,我现在就不担心效率。

标准库中没有任何内容

但是,Apache Commons类通过交集和减法方法为您提供了此功能:

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);
Collection old=。。。;
集合neww=。。。;
已删除集合=(集合)集合utils.subtract(旧、新);
集合更新=(集合)CollectionUtils.intersection(旧的、新的);
Collection newResult=(Collection)CollectionUtils.subtract(新、旧);

(您需要(未选中的)强制转换,因为CollectionUtils未被泛化。)

没有标准方式抱歉。但是,使用标准JDK可以相当轻松地完成这项工作,而无需添加对ApacheCommons的依赖(正如其他人所建议的)。假设您的列表是实例:

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);
List oldList=。。。
List newList=。。。
移除列表=新的ArrayList(旧列表);
移除。移除所有(新列表);
列表相同=新的ArrayList(旧列表);
相同。保留(新列表);
添加的列表=新的ArrayList(新列表);
添加.删除所有(旧列表);

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

保留(c组)

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

removeAll(集合c)

删除此集合的所有元素 也包含在 指定的集合(可选) 操作)。此呼叫返回后, 此集合将不包含 元素与指定的 收藏


如果有标准方法,我不知道…
我查看了disjoint()和indexofpublist()(不确定是否有用)。
我还研究了,如果显然没有这样的工具,那么这里有一些有用的工具,比如的filter()函数,如果你做了一个正确的谓词,它可以帮助你


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

就我个人而言,我认为解释两个列表之间差异的唯一合理方法是使用成熟的diff算法(如unix diff命令)


不过,布景的故事要简单得多。Google Collections提供了一种方法,以及并集和交集。

您关心列表顺序吗?例如,迄今为止提出的涉及保留/移除所有的解决方案不会处理新列表包含与旧列表相同的元素的情况,尽管顺序不同;e、 g.{“foo”,“bar”}vs{“bar”,“foo”}。只要正确实现了equals方法,我就不明白为什么顺序会影响removeAll等。在javadoc中肯定不建议:从此列表中删除指定集合中包含的所有元素(可选操作)。不幸的是,这有点错误。。。removeAll和类似命令对传入列表进行操作并返回布尔值。这样就不会编译了。需要:添加列表=新建ArrayList(新建列表);添加.删除所有(旧列表);等因此,apache commons方法毕竟可能有一个案例。。。