- 1、集合去重
- 2、集合获取重复元素
- 3、统计重复次数
开发过程中常遇见的三种问题:集合去重、获取重复元素、统计重复次数。
网上搜了下,实现过程五花八门,这里简单汇总下我觉得比较常用的方式:
方法:List转set;一行代码即可;
前提是不需要获取重复元素和统计重复次数,最简单的就是把List转为Set,众所周知,set的底层是hashMap,元素不可重复;所以在转换的过程中即可实现自动去重;
List2、集合获取重复元素list=ListUtil.toList("A","B","C","A"); Set set =list.stream().collect(Collectors.toSet()); System.err.println(set); //[A, B, C]
方法:通过下标判断;一行代码即可;
前提是不需要统计重复次数,其实就是循环判断一个元素的首个下标和最后一个下标是否相同,如果元素有重复,那么得到的下标也一定是两个;
List3、统计重复次数list=ListUtil.toList("A","B","C","A"); List result = list.stream().filter(str->list.indexOf(str)!=list.lastIndexOf(str)).distinct().collect(Collectors.toList()); System.err.println(result); //[A]
方法:转换为Map;一行代码即可;
首先将list转换为map,map的key为集合元素,value为元素出现的次数;
当然如果需要获取重复元素,之后对map的value筛选,得到出现次数大于1的元素即可;
//第一种:使用stream流 Listlist=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 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 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的依赖,如果为了省事可以使用上面一种方法; Listlist=ListUtil.toList("A","B","C","A"); //得到集合各元素出现的次数 Map countMap = CollectionUtil.countMap(list); System.err.println(countMap); //{A=2, B=1, C=1} //筛选重复元素 List map = countMap.keySet().stream().filter(a->countMap.get(a)>1).collect(Collectors.toList()); System.err.println(map); //[A]



