java - 数组中的两个包含同一类对象的Arraylists?

  显示原文与译文双语对照的内容
90 2

我有 2个不同大小的列表属于同一个 class Officer,它们具有属性:

Integer id;
Integer level; 
String role;

为了生成两个新列表insertLst和 deleteList,我想比较这两个列表list1和 list2.

清单 1和list2都包含唯一元素。

insertLst: 这里列表包含list1中的项,而不是 list2.

deleteList: 这里列表包含list2中的项,而不是 list1.

我不知道应该如何做,可能是使用 org.apache.commons.collections.CollectionUtils API 。

你能给我一个java代码来生成这两个列表insertLst和deleteList?

时间:原作者:0个回答

78 1

如果你想使用 org.apache.commons.collections.CollectionUtils,那么你应该使用减法方法。

Collection<Officer> insertList= CollectionUtils.subtract(list1, list2);
Collection<Officer> deleteList = CollectionUtils.subtract(list2, list1);

或者你可以像这样编写( 传递在方法中填充的空列表) 不将另一个库添加到你的依赖项:

static <T> void process(List<T> list1, List<T> list2, List<T> insertList, List<T> deleteList) {
 for (T t: list1) {
 if (!list2.contains(t)) {
 insertList.add(t);
 }
 }
 for (T t: list2) {
 if (!list1.contains(t)) {
 deleteList.add(t);
 }
 }
}

不要忘了在两种情况下都重写class和hashcode方法。请在这里引用 ,以便解释

原作者:
101 0

确保 Officer 类重写 equals() ( 还有 hashCode() ) 方法,它将非常容易:

List<Officer> list1 =.. .//your list1
List<Officer> list2 =.. .//your list2
List<Officer> insertLst = new ArrayList<>(list1);
insertLst.removeAll(list2);
List<Officer> deleteList= new ArrayList<>(list2);
deleteList.removeAll(list1);
原作者:
52 0
final List<Officer> one = new ArrayList<Officer>();
...
final List<Officer> two = new ArrayList<Officer>();
...
final List<Officer> insertList = new ArrayList<Officer>(one);
insertList.removeAll(two);
final List<Officer> removeList = new ArrayList<Officer>(two);
removeList.removeAll(one);

编辑:就像jlordo所说的,确保你重写了hashCode和 Equals

原作者:
121 4

你得在这两个名单上循环。

这样做的一种方法可能是:

ArrayList <Officer> list1=.. ..
ArrayList <Officer> list2=.. ..
ArrayList <Officer> insertList= new ArrayList <Officer>();
ArrayList <Officer> deleteList= new ArrayList <Officer>();
for(Officer x:list1){
 for(Officer y:list2){
//business logic here
 if(x.id==y.id){
 insertList.add(x);//example code to add an Object in a List
 }
 }
}

业务逻辑部分由你决定。你可以比较两个列表之间的数据,并决定什么是在哪里。

希望这个有帮助

原作者:
...