简单的问题。我有一张新单子和一张旧单子。在java中,有没有一个标准的方法/库允许我比较这两个列表,并确定哪些项目已经更新/删除或者是全新的?e、 g.我应该有三个列表-删除的项目(旧项目但不在新项目中)、更新的项目(两个项目中的项目)、新项目(新项目和不在旧项目中的项目)。我可以自己写,但不知道是否有一个标准的方法来做这件事。列表中的对象正确地实现了equals。
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没有被泛化。)
o75abkj42#
没有标准的方法对不起。不过,使用标准jdk可以相当轻松地完成这项工作,而无需添加对apachecommons的依赖(正如其他人所建议的那样)。假设你的名单是 List<T> 示例:
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);
368yc8dk3#
我个人认为,解释两个列表之间差异的唯一合理方法是使用一个完整的diff算法(比如unix diff命令)。不过,布景的故事要简单得多。googlecollections提供了set.difference(set,set)方法,以及并集和交集。
z18hc3ub4#
如果有一个标准的方法,我不知道。。。我查看了集合,但只看到disjoint()(这已经是一个信息……)和indexofpublist()(不确定它是否有用)。我还研究了googlecollections,如果显然没有这样的工具,那么这里有一些有用的工具,比如collections2的filter()函数,如果你做了一个正确的 predicate ,它会有所帮助。[编辑]我错过了删除和保留收集方法。。。我不删除这个答案,即使有点可怜,因为它是其他答案的补充(我认为谷歌收藏至少值得一提!)
vyswwuz25#
我将使用apachecollectionutils并使用union(两个函数中的项)和disjunction函数(更改顺序以获得其中一个)。理想情况下,你会让一个通过所有的元素,而不是3,但如果这不是你的瓶颈,我不会担心效率现在。
eanckbw96#
我认为您也可以通过标准java库来实现这一点。请看java.util.collection的以下方法:保留(集合c)仅保留此集合中包含在指定集合中的元素(可选操作)。换句话说,从该集合中删除指定集合中不包含的所有元素。removeall(集合c)删除指定集合中也包含的此集合的所有元素(可选操作)。此调用返回后,此集合将不包含与指定集合公用的元素。
6条答案
按热度按时间5ssjco0h1#
标准图书馆里什么都没有。
不过,apache commons collectionutils类通过intersection和subtract方法提供了以下功能:
(您需要(未选中)强制转换,因为collectionutils没有被泛化。)
o75abkj42#
没有标准的方法对不起。不过,使用标准jdk可以相当轻松地完成这项工作,而无需添加对apachecommons的依赖(正如其他人所建议的那样)。假设你的名单是
List<T>
示例:368yc8dk3#
我个人认为,解释两个列表之间差异的唯一合理方法是使用一个完整的diff算法(比如unix diff命令)。
不过,布景的故事要简单得多。googlecollections提供了set.difference(set,set)方法,以及并集和交集。
z18hc3ub4#
如果有一个标准的方法,我不知道。。。
我查看了集合,但只看到disjoint()(这已经是一个信息……)和indexofpublist()(不确定它是否有用)。
我还研究了googlecollections,如果显然没有这样的工具,那么这里有一些有用的工具,比如collections2的filter()函数,如果你做了一个正确的 predicate ,它会有所帮助。
[编辑]我错过了删除和保留收集方法。。。我不删除这个答案,即使有点可怜,因为它是其他答案的补充(我认为谷歌收藏至少值得一提!)
vyswwuz25#
我将使用apachecollectionutils并使用union(两个函数中的项)和disjunction函数(更改顺序以获得其中一个)。
理想情况下,你会让一个通过所有的元素,而不是3,但如果这不是你的瓶颈,我不会担心效率现在。
eanckbw96#
我认为您也可以通过标准java库来实现这一点。请看java.util.collection的以下方法:
保留(集合c)
仅保留此集合中包含在指定集合中的元素(可选操作)。换句话说,从该集合中删除指定集合中不包含的所有元素。
removeall(集合c)
删除指定集合中也包含的此集合的所有元素(可选操作)。此调用返回后,此集合将不包含与指定集合公用的元素。