java类自动比对字段值不一样_Java对比两个list并找出其中不同的值(list里面的具体类单独抽出不同字段)...

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

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

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

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

ArrayList 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 changeField = new ArrayList<>();

List finalLst1 = new ArrayList<>();

List finalLst2 = new ArrayList<>();

lst1.forEach(o -> finalLst1.add(Utils.objectToJson(o)));

lst2.forEach(o -> finalLst2.add(Utils.objectToJson(o)));

HashMap map1= new HashMap<>();

HashMap map2= new HashMap<>();

int minSize = finalLst1.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

map1.put(i,finalLst1.get(i));

}

}else if (finalLst2.size()>finalLst1.size()){

for (int i = minSize; i

map2.put(i,finalLst2.get(i));

}

}

for (Integer i : map1.keySet()) {

if (map2.containsKey(i)){

try {

Map info1 = Utils.jsonToObject(map1.get(i),Map.class);

Map 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 + '\'' +

'}';

}

}

打完收工

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值