集合操作重复元素
开发过程中常遇见的三种问题:集合去重、获取重复元素、统计重复次数。
网上搜了下,实现过程五花八门,这里简单汇总下我觉得比较常用的方式:
1、集合去重
方法:List转set;一行代码即可;
前提是不需要获取重复元素和统计重复次数,最简单的就是把List转为Set,众所周知,set的底层是hashMap,元素不可重复;所以在转换的过程中即可实现自动去重;
List<String> list=ListUtil.toList("A","B","C","A");
Set<String> set =list.stream().collect(Collectors.toSet());
System.err.println(set); //[A, B, C]
2、集合获取重复元素
方法:通过下标判断;一行代码即可;
前提是不需要统计重复次数,其实就是循环判断一个元素的首个下标和最后一个下标是否相同,如果元素有重复,那么得到的下标也一定是两个;
List<String> list=ListUtil.toList("A","B","C","A");
List<String> result = list.stream().filter(str->list.indexOf(str)!=list.lastIndexOf(str)).distinct().collect(Collectors.toList());
System.err.println(result); //[A]
3、统计重复次数
方法:转换为Map;一行代码即可;
首先将list转换为map,map的key为集合元素,value为元素出现的次数;
当然如果需要获取重复元素,之后对map的value筛选,得到出现次数大于1的元素即可;
//第一种:使用stream流
List<String> list=ListUtil.toList("A","B","C","A");
//得到集合各元素出现的次数
//解释下这一句,toMap后面有三个参数,key -> key表示以list中的元素本身作为map的key,
// value -> 1表示map的value初始值为1,(value1,value2) ->value1 + value2)表示map的key值冲突时对map的value值进行累加;
Map<String, Integer> countMap = list.stream().collect(Collectors.toMap(key -> key, value -> 1, (value1,value2) ->value1 + value2));
System.err.println(countMap); //{A=2, B=1, C=1}
//筛选重复元素
List<String> map = countMap.keySet().stream().filter(a->countMap.get(a)>1).collect(Collectors.toList());
System.err.println(map); //[A]
//第二种:使用Hutool工具类,import cn.hutool.core.collection.CollectionUtil;
//这是我常用的工具类,需要添加hutool的依赖,如果为了省事可以使用上面一种方法;
List<String> list=ListUtil.toList("A","B","C","A");
//得到集合各元素出现的次数
Map<String, Integer> countMap = CollectionUtil.countMap(list);
System.err.println(countMap); //{A=2, B=1, C=1}
//筛选重复元素
List<String> map = countMap.keySet().stream().filter(a->countMap.get(a)>1).collect(Collectors.toList());
System.err.println(map); //[A]
版权声明:本文为qq_45445841原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。