java List Map数据对比 找出相同和不同的内容

最近在搞一个,数据对比功能,但是需要得到新数据和数据库的数据,多出来的数据和缺少的内容


原先搞出来的是 弄了两个List集合进行匹配代码就不贴了,先说一下最早的思路

List<GongGl> list1=new ArrayList<GongGl>();//新数据

List<GongGl> list2=new ArrayList<GongGl>();//数据库数据

GongGl //公共类

如果list1>list2则说明有新数据,然后拿着list1里面的数据跟list2匹配,总会有一个不一样的,得到不一样以后直接放到数据库中

两个for循环

int aa=0;

for(int i=0;i<list1.size();i++){

GongGl  ggl=(GongGl )list1.get(i);

for(int j=0;j<list2.size();j++){

GongGl  ggl2=(GongGl )list2.get(i);

if(ggl.getName.equals(ggl2.getName)){

aa=1;

}

}

if(aa==0){

得到多出来的软件

}

}

后来经过测试发现,效率比较慢,这么循环假如各有1W条数据,你可以计算一下得循环多少次,再加上多人操作的话,

不出意外肯定会崩溃,后来优化了一下,下面是优化方法

// 生成map方法key为名称和版本
 public Map<String, GongGl> createMap(List<GongGl> list) {
  Map<String, GongGl> map = new HashMap<String, GongGl>();
  for (GongGl g : list) {
   String key = "";
   String name = g.getRjmc();
   String vesion = g.getRjbb();
   if (name != null && !"".equals(name)) {
    key += name;
    key += "_";
   }
   if (vesion != null && !"".equals(vesion)) {
    key += vesion;
   }

   map.put(key, g);
  }
  return map;
 }

 /**
  * 获取comMap中有的数据,且该数据在target中未存在
  *
  * @param target
  *            ,比较目标
  * @param comMap
  *            需要比较的数据
  * @return comMap中比target多出的数据。
  */
 public List<GongGl> getDiffrentList(Map<String, GongGl> target,
   Map<String, GongGl> comMap) {
  List<GongGl> list = new ArrayList<GongGl>();
  for (Map.Entry<String, GongGl> entry : comMap.entrySet()) {
   String key = entry.getKey();
   if (!target.containsKey(key)) {//如果没有则存放到List
    list.add(comMap.get(key));
   }
  }
  return list;
 }

 /**
  * 获取多出来的map
  *
  * @param list_1
  * @param list_2
  * @return list_over_1的map为list_1比list_2多出来的集合,list_over_1同样。
  */
 public Map<String, List<GongGl>> getComResulMap(List<GongGl> list_1,
   List<GongGl> list_2) {
  Map<String, List<GongGl>> map = new HashMap<String, List<GongGl>>();
  // 1 转换成响应的map
  Map<String, GongGl> map_1 = this.createMap(list_1);
  Map<String, GongGl> map_2 = this.createMap(list_2);
  List<GongGl> list_over_1 = this.getDiffrentList(map_2, map_1);
  List<GongGl> list_over_2 = this.getDiffrentList(map_1, map_2);
  map.put("list_over_1", list_over_1);
  map.put("list_over_2", list_over_2);
  return map;
 }

这么调用就可以了

Map<String, List<GongGl>> map = getComResulMap(lll,ggllist);
      List<GongGl> lllOver = map.get("list_over_1");// 缺少的数据
      List<GongGl> ggllistOver = map.get("list_over_2");// 多出的数据

剩下的就是你自己的逻辑处理了

有不明白的可以加 QQ695438455,上班时间一般都在线。

大家要是还有什么好办法,也可以留言,一起完善一下


可以使用Java 8的Stream API和lambda表达式来实现。假设需要比较的属性为"name",示例代码如下: ```java import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { // 假设list中的每个map都有一个名为"name"的属性需要比较 List<Map<String, Object>> oldList = new ArrayList<>(); Map<String, Object> map1 = new HashMap<>(); map1.put("name", "Alice"); map1.put("age", 20); oldList.add(map1); Map<String, Object> map2 = new HashMap<>(); map2.put("name", "Bob"); map2.put("age", 25); oldList.add(map2); Map<String, Object> map3 = new HashMap<>(); map3.put("name", "Alice"); map3.put("age", 30); oldList.add(map3); List<Map<String, Object>> newList = oldList.stream() .collect(Collectors.groupingBy(map -> map.get("name"))) .entrySet().stream() .filter(entry -> entry.getValue().size() == 1) .flatMap(entry -> entry.getValue().stream()) .collect(Collectors.toList()); // newList中保存的就是所有'name'属性不相同map System.out.println(newList); } } ``` 输出结果为: ``` [{name=Alice, age=20}, {name=Bob, age=25}] ``` 其中,代码中的`Collectors.groupingBy`方法可以将list中的map按照"name"属性进行分组,得到一个Map,其中key为"name"属性的值,value为所有具有该"name"属性的map。然后,`Stream`的`filter`方法可以筛选出所有分组后,只有一个map的分组,即所有'name'属性不相同map所在的分组,最后使用`flatMap`方法将这些map取出,放入一个新的list中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值