1

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

Integer id;
Integer level; 
String role;

我想比较这两个列表list1 和list2,以便生成两个新列表insertLst 和deleteList。

列表 1 和列表 2 都包含唯一元素。

insertLst:此列表包含 list1 中的项目,而不是 list2 中的项目。

deleteList:此列表包含 list2 中的项目,而不是 list1 中的项目。

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

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

4

4 回答 4

3

If you want to use org.apache.commons.collections.CollectionUtils then you should use subtract method.

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

or you could write it like this (passing empty lists that are filled in method) not to add another library to your dependencies:

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);
        }
    }
}

Don't forget to override equals and hashcode methods for you class Officer in both cases. Please refer here for explanation

于 2013-06-06T11:34:39.297 回答
1

确保您的Officer类覆盖equals()(and 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);
于 2013-06-06T11:09:05.810 回答
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

于 2013-06-06T11:09:33.843 回答
0

您必须遍历这两个列表....

一种方法可能是这个:

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
     }
  }
}

业务逻辑部分由您决定...您可以比较两个列表之间的数据并决定将哪些内容放在哪里...

希望这可以帮助

于 2013-06-06T11:12:19.387 回答