Java对比两个list并找出其中不同的值(list里面的具体类单独抽出不同字段)

   今天凯哥交给我一个任务,在报警模版中对比新旧两个数据,找出其中不同的部分,之前是把不同的数据转string做了对比,并没有对list中的对象做判断,修改完之后记录一下。

   list做对比,如果 list 里面的数据是乱序的,需要对list排序。使用 Collections.sort()就可以了。但是list里面的对象不继承于comparable接口的话,要自己处理一下。方法就是实现接口,重写comparTo,我比较懒,就直接使用lambada的stream转string了。

   准备工作做完,接下来就要开始对比了,我的第一个版本就是使用list.removeIf( lambada... ),用另一个list做判断是否包含,并remove,最后合并。相当简单粗暴。上代码。

   

ArrayList<String> lst1 = new ArrayList<>(Arrays.asList("a","b","e"));
ArrayList<String> lst2 = new ArrayList<>(Arrays.asList("b","e","a"));

Collections.sort(lst1);
Collections.sort(lst2);

if (lst1.equals(lst2)){

}else{
lst1.removeAll(lst2);
lst1.addAll(lst2);

System.out.println(Arrays.toString(lst1.toArray()));
}

后来要对list中的数据单独抽出来,只拿出不一样的数据,我只好改进了一下,因我的数据是有序的,所以跳过sort这一步,有新增/删除/修改,所以多一个map,对两个list的序号数据对比记录下来,然后再提取两个map的数据,根据key对应就可以啦。上代码。

List<Change> changeField = new ArrayList<>();
List<String> finalLst1 = new ArrayList<>();
List<String> finalLst2 = new ArrayList<>();
lst1.forEach(o -> finalLst1.add(Utils.objectToJson(o)));
lst2.forEach(o -> finalLst2.add(Utils.objectToJson(o)));

HashMap<Integer,String> map1= new HashMap<>();
HashMap<Integer,String> map2= new HashMap<>();

int minSize = finalLst1.size()<finalLst2.size()?finalLst1.size():finalLst2.size();


for (int i = 0; i < minSize; i++) {
if (!finalLst1.get(i).equals(finalLst2.get(i))){
if (!finalLst2.contains(finalLst1.get(i))){

map1.put(i,finalLst1.get(i));
map2.put(i,finalLst2.get(i));
}
}
}

if (finalLst1.size()>finalLst2.size()){
for (int i = minSize; i <finalLst1.size() ; i++) {
map1.put(i,finalLst1.get(i));
}

}else if (finalLst2.size()>finalLst1.size()){
for (int i = minSize; i <finalLst2.size() ; i++) {
map2.put(i,finalLst2.get(i));
}
}

for (Integer i : map1.keySet()) {
if (map2.containsKey(i)){
try {
Map<String,Object> info1 = Utils.jsonToObject(map1.get(i),Map.class);
Map<String,Object> info2 = Utils.jsonToObject(map2.get(i),Map.class);

for (String s : info1.keySet()) {
if (!info1.get(s).equals(info2.get(s))){
changeField.add(new Change(field.getName()+"."+s, Utils.objectToJson(info1.get(s)),Utils.objectToJson(info2.get(s))));
}
}

} catch (JsonSyntaxException e) { }
}else{
changeField.add(new Change(field.getName(), map1.get(i),"null"));
}
}

for (Integer i : map2.keySet()) {
if (!map1.containsKey(i)){
changeField.add(new Change(field.getName(),"null",map2.get(i)));
}
}


==================chang类的声明 ======================
private static class Change {
String field;
String before;
String after;

public Change(String field, String before, String after) {
this.field = field;
this.before = before;
this.after = after;
}

@Override
public String toString() {
return "Change{" +
"field='" + field + '\'' +
", before='" + before + '\'' +
", after='" + after + '\'' +
'}';
}
}

打完收工
写博客也不费时间嘛,十来分钟搞定第一篇!加油啊⛽️!

猜你喜欢

转载自www.cnblogs.com/suntianliang/p/11656928.html