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 + '\'' +
'}';
}
}

打完收工
寫博客也不費時間嘛,十來分鍾搞定第一篇!加油啊⛽️!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM