今天凯哥交给我一个任务,在报警模版中对比新旧两个数据,找出其中不同的部分,之前是把不同的数据转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 + '\'' + '}'; }}打完收工写博客也不费时间嘛,十来分钟搞定第一篇!加油啊⛽️!