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

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

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

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

1ArrayList<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对应就可以啦。上代码。 2 3List<Change> changeField = new ArrayList<>(); 4 5List<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类的声明 ====================== 6 7private 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 + '\'' + '}'; }}打完收工写博客也不费时间嘛,十来分钟搞定第一篇!加油啊⛽️!
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java8新特性

Stream将List转换为Map,使用Collectors.toMap方法进行转换背景:User类,类中分别有id,name,age三个属性。List集合,userList,存储User对象1、指定keyvalue,value是对象中的某个属性值。 Map<Integer,StringuserMap1userList.str

List的Select 和Select().tolist()

List<PersondelpnewList<Person{newPerson{Id1,Name"小明1",Age11,Sign0},newPerson{Id2,Name"小明2",Age12,