当前位置: 首页 > news >正文

非对象集合交、并、差处理

对于集合取交集、并集的处理其实有很多种方式,这里就介绍3种

  • 第一种 是CollectionUtils工具类

  • 第二种 是List自带方法

  • 第三种 是JDK1.8 stream 新特性

1、CollectionUtils工具类

下面对于基本数据(包扩String)类型中的集合进行demo示例。

 public static void main(String[] args) {String[] arrayA = new String[] { "1", "2", "3", "4"};String[] arrayB = new String[] { "3", "4", "5", "6" };List<String> listA = Arrays.asList(arrayA);List<String> listB = Arrays.asList(arrayB);//1、并集 unionSystem.out.println(CollectionUtils.union(listA, listB));//输出: [1, 2, 3, 4, 5, 6]//2、交集 intersectionSystem.out.println(CollectionUtils.intersection(listA, listB));//输出:[3, 4]//3、交集的补集(析取)disjunctionSystem.out.println(CollectionUtils.disjunction(listA, listB));//输出:[1, 2, 5, 6]//4、差集(扣除)System.out.println(CollectionUtils.subtract(listA, listB));//输出:[1, 2]}

2、List自带方法

 public static void main(String[] args) {String[] arrayA = new String[] { "1", "2", "3", "4"};String[] arrayB = new String[] { "3", "4", "5", "6" };List<String> listA = Arrays.asList(arrayA);List<String> listB = Arrays.asList(arrayB);//1、交集List<String>  jiaoList = new ArrayList<>(listA);jiaoList.retainAll(listB);System.out.println(jiaoList);//输出:[3, 4]//2、差集List<String>  chaList = new ArrayList<>(listA);chaList.removeAll(listB);System.out.println(chaList);//输出:[1, 2]//3、并集 (先做差集再做添加所有)List<String>  bingList = new ArrayList<>(listA);bingList.removeAll(listB); // bingList为 [1, 2]bingList.addAll(listB);  //添加[3,4,5,6]System.out.println(bingList);//输出:[1, 2, 3, 4, 5, 6]}

注意 : intersection和retainAll的差别

它们的返回类型是不一样的,intersection返回的是一个新的List集合,而retainAll返回是Bollean类型。

那就说明retainAll方法是对原有集合进行处理再返回原有集合,会改变原有集合中的内容。

注意 : Arrays.asList将数组转集合不能进行add和remove操作。

原因:调用Arrays.asList()生产的List的add、remove方法时报异常,这是由Arrays.asList() 返回的市Arrays的内部类ArrayList, 而不是java.util.ArrayList。

所以正确做法如下

  String[] array = {"1","2","3","4","5"};List<String> list = Arrays.asList(array);List arrList = new ArrayList(list);arrList.add("6");

 3、JDK1.8 stream 新特性

 public static void main(String[] args) {String[] arrayA = new String[] { "1", "2", "3", "4"};String[] arrayB = new String[] { "3", "4", "5", "6" };List<String> listA = Arrays.asList(arrayA);List<String> listB = Arrays.asList(arrayB);// 交集List<String> intersection = listA.stream().filter(item -> listB.contains(item)).collect(toList());System.out.println(intersection);//输出:[3, 4]// 差集 (list1 - list2)List<String> reduceList = listA.stream().filter(item -> !listB.contains(item)).collect(toList());System.out.println(reduceList);//输出:[1, 2]// 并集 (新建集合:1、是因为不影响原始集合。2、Arrays.asList不能add和remove操作。List<String> listAll = listA.parallelStream().collect(toList());List<String> listAll2 = listB.parallelStream().collect(toList());listAll.addAll(listAll2);System.out.println(listAll);//输出:[1, 2, 3, 4, 3, 4, 5, 6]// 去重并集 List<String> list =new ArrayList<>(listA);list.addAll(listB);List<String> listAllDistinct = list.stream().distinct().collect(toList());System.out.println(listAllDistinct);//输出:[1, 2, 3, 4, 5, 6]}

总结 :第一种方式常用,因为第二种还需要确定该集合是否被多次调用。第三种可读性不高。

http://www.lryc.cn/news/254711.html

相关文章:

  • 时间序列预测实战(二十五)PyTorch实现Seq2Seq进行多元和单元预测(附代码+数据集+完整解析)
  • 电子学会C/C++编程等级考试2022年09月(三级)真题解析
  • 【数据库】基于时间戳的并发访问控制,乐观模式,时间戳替代形式及存在的问题,与封锁模式的对比
  • Python 日志(略讲)
  • C++ 指针进阶
  • stm32中滴答定时器与普通定时器的区别
  • 某60区块链安全之薅羊毛攻击实战一学习记录
  • Java程序员,你掌握了多线程吗?(文末送书)
  • 排序算法——桶排序/基数排序/计数排序
  • FFmpeg之将视频转为16:9(横屏)或9:16(竖屏)(三十六)
  • git学习笔记02(小滴课堂)
  • 2022 RedisDays 内容揭秘
  • 论文阅读——Img2LLM(cvpr2023)
  • 南京大学考研机试题DP
  • 如何进行多ip服务器租用?
  • (动手学习深度学习)第13章 实战kaggle竞赛:树叶分类
  • vue中shift+alt+f格式化防止格式掉其它内容
  • WPS导出的PDF比较糊,和原始的不太一样,将带有SVG的文档输出为PDF
  • Linux /etc/hosts文件
  • webpack学习-3.管理输出
  • 【Go语言反射reflect】
  • LC-1466. 重新规划路线(DFS、BFS)
  • 自动数据增广论文笔记 | AutoAugment: Learning Augmentation Strategies from Data
  • CTF 7
  • 无公网IP环境Windows系统使用VNC远程连接Deepin桌面
  • java--枚举
  • JVM垃圾回收机制GC
  • 详解JAVA中的@ApiModel和@ApiModelProperty注解
  • TiDB专题---2、TiDB整体架构和应用场景
  • 性能调优入门