对比两个List,区分重复数据(优化)。

9 篇文章 0 订阅

1. 背景

现在日常工作中经常会遇到两组数据对比碰撞的需求,菜菜不才,之前写了一个不怎么优雅的代码才解决了问题,而且还是只能对比String的,菜菜有空后赶紧写了一个比较优雅的方式解决了list比对的问题。

2. 代码

2.1 原始版本

/**
* 两个List对比
* @param listA
* @param listB
* @return  repeatList  A与B的重复数据
* @return  returnList  A与B的不重复数据
*/
public static Map<String,List<String>> stringIntersectionDelete(List<String> listA, List<String> listB){
  //返回一个map,一个是去重后的list,一个是被删除的list
  Map<String,List<String>> returnMap=new HashMap<>(16);

  List<String> repeatList=new ArrayList<>();

  for (Iterator<String> itA = listA.iterator(); itA.hasNext();)
  {
      String temp = itA.next();
      // itA.next() 只能在外层循环里面调用1次
      for (int i = 0; i < listB.size(); i++)
      {
          if (temp.equals(listB.get(i)))
          // 你不该在这里多次调用itA.next()的
          {
              repeatList.add(temp);
              itA.remove();
          }
      }
  }
  returnMap.put("repeatList",repeatList);
  returnMap.put("returnList",listA);
  return returnMap;
}

2.2 改良版本

List<String> list1 = Arrays.asList("123", "456", "789", "987", "654", "321","222");

List<String> list2 = Arrays.asList("123", "456", "789");
//核心代码
Map<Boolean, List<String>> collect = list1.stream().collect(Collectors.partitioningBy(obj ->
      list2.stream().anyMatch(obj2 -> obj.equals(obj2))
));
System.out.println(collect);

3. 结语

可以看到改良后的代码是比较优雅的,必经就两行。内部底层也是使用了两层for所以时间维度上是一样的,简介度却高了很多,最主要的是,还可以用在Object 上,只要挑出对比值,或者整个对象toString对比即可,使用程度也是有提升的。所以还是要多看一点新特性啊。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值