面试题:不使用distinct()通过Java Stream查找整数List重复元素
问题说明
面试中遇到的Java技术题要求:在不调用Java Stream的distinct()方法的前提下,查找存储Integer类型元素的List中的重复元素,实现过程必须使用Java Stream API,全程禁止调用distinct()方法。
题目给出的初始桩代码:
List<Integer> listOfInt = new ArrayList<>();
实现思路
核心可以利用两种不依赖distinct()的去重判断逻辑实现:
- 利用
Set集合元素不重复的原生特性,通过Set.add()的返回值判断元素是否重复 - 利用Stream的分组收集器统计每个元素的出现频次,筛选频次大于1的元素即为重复值
方案1:基于Set判断实现(性能最优)
Set.add()方法在插入已存在元素时会返回false,插入新元素返回true,可以直接作为过滤条件筛选重复元素,代码如下:
import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; public class DuplicateFinder { public static void main(String[] args) { List<Integer> listOfInt = new ArrayList<>(); // 补充测试数据 listOfInt.add(1); listOfInt.add(2); listOfInt.add(3); listOfInt.add(2); listOfInt.add(3); listOfInt.add(3); listOfInt.add(4); Set<Integer> visited = new HashSet<>(); List<Integer> duplicates = listOfInt.stream() // 已存在的元素add返回false,取反后命中filter,判定为重复 .filter(num -> !visited.add(num)) // 这一步是为了避免同一重复值多次出现在结果中,比如3重复2次,结果只保留一个3 .collect(Collectors.toSet()) .stream() .collect(Collectors.toList()); System.out.println(duplicates); // 输出结果 [2, 3] } }
如果需求是要列出所有重复位置的元素(即同一重复值出现几次就返回几次),可以去掉转Set的步骤,直接filter后收集到List即可。
方案2:基于分组统计实现(无外部变量)
如果不想引入外部Set变量,可以用groupingBy收集器统计每个元素的出现次数,再筛选重复值,全程纯Stream链式操作:
import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class DuplicateFinder { public static void main(String[] args) { List<Integer> listOfInt = new ArrayList<>(); // 补充测试数据 listOfInt.add(1); listOfInt.add(2); listOfInt.add(3); listOfInt.add(2); listOfInt.add(3); listOfInt.add(3); listOfInt.add(4); List<Integer> duplicates = listOfInt.stream() // 按元素值分组,统计每个值的出现次数 .collect(Collectors.groupingBy(num -> num, Collectors.counting())) .entrySet() .stream() // 筛选出现次数大于1的元素 .filter(entry -> entry.getValue() > 1) .map(entry -> entry.getKey()) .collect(Collectors.toList()); System.out.println(duplicates); // 输出结果 [2, 3] } }
方案对比
- 方案1时间复杂度O(n),遍历一次列表即可完成筛选,性能更高,适合数据量较大的场景
- 方案2时间复杂度同样为O(n),没有外部副作用变量,逻辑更直观,还可以同时拿到元素的重复次数,适合需要额外统计信息的场景
- 两种方案均未调用
distinct()方法,完全符合题目要求
内容的提问来源于stack exchange,提问作者jagdish khetre
相关产品推荐
相关产品推荐

