我有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?
答案 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
}
}
}
业务逻辑部分取决于您......您可以比较两个列表之间的数据并确定其中的内容......
希望这有帮助