如何比较两个包含Java中同一类对象的Arraylists?

时间:2013-06-06 11:03:46

标签: java arrays list java-ee arraylist

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

Integer id;
Integer level; 
String role;

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

list 1和list2都包含唯一元素。

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

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

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

你能否建议我使用java代码生成这两个列表insertLst和deleteList?

4 个答案:

答案 0 :(得分:2)

如果你想使用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);
        }
    }
}

在这两种情况下,不要忘记覆盖你的类官员的equals和hashcode方法。有关说明,请参阅here

答案 1 :(得分:1)

确保您的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);

答案 2 :(得分: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

答案 3 :(得分: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
     }
  }
}

业务逻辑部分取决于您......您可以比较两个列表之间的数据并确定其中的内容......

希望这有帮助