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

Wesley13
• 阅读 1474

   今天凯哥交给我一个任务,在报警模版中对比新旧两个数据,找出其中不同的部分,之前是把不同的数据转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 + '\'' +                '}';    }}打完收工写博客也不费时间嘛,十来分钟搞定第一篇!加油啊⛽️!
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
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
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java8新特性
Stream将List转换为Map,使用Collectors.toMap方法进行转换背景:User类,类中分别有id,name,age三个属性。List集合,userList,存储User对象1、指定keyvalue,value是对象中的某个属性值。 Map<Integer,StringuserMap1userList.str
Stella981 Stella981
3年前
List的Select 和Select().tolist()
List<PersondelpnewList<Person{newPerson{Id1,Name"小明1",Age11,Sign0},newPerson{Id2,Name"小明2",Age12,
Wesley13 Wesley13
3年前
Java开发者容易犯的十个错误
!(https://oscimg.oschina.net/oscnet/c9f00cc918684fbe8a865119d104090b.gif)Top1.数组转换为数组列表将数组转换为数组列表,开发者经常会这样做:\java\List<StringlistArrays.asList(arr);Arr
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
Java将List中的实体按照某个字段进行分组的算法
publicvoidtest(){List<UserlistnewArrayList<();//User实体测试用Stringid,name;//当前测试以id来分组,具体请按开发场景修改list.add(newUse
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这