如何使用Java Stream从列表中筛选唯一元素及去重后的重复元素
解法思路
你当前用的distinct()只能拿到所有去重后的元素,无法区分元素是否出现过重复,所以需要先统计每个元素的出现频次,再按频次筛选即可:
- 统计ArrayList中每个元素的出现次数
- 遍历频次统计结果,出现次数为1的元素存入B,出现次数≥2的元素存入C
完整代码实现
Stream流写法(Java 8及以上适用)
import java.util.*; import java.util.stream.Collectors; public class SplitList { public static void main(String[] args) { ArrayList<Integer> A = new ArrayList<>(Arrays.asList(1,2,5,2,4,2,1,3,6,1,4)); // 统计每个元素的出现次数 Map<Integer, Long> countMap = A.stream() .collect(Collectors.groupingBy(num -> num, Collectors.counting())); // 筛选仅出现一次的元素到B List<Integer> B = countMap.entrySet().stream() .filter(entry -> entry.getValue() == 1) .map(Map.Entry::getKey) .collect(Collectors.toList()); // 筛选出现过重复的元素去重后到C List<Integer> C = countMap.entrySet().stream() .filter(entry -> entry.getValue() >= 2) .map(Map.Entry::getKey) .collect(Collectors.toList()); // 验证输出 System.out.println(B); // [5, 3, 6] System.out.println(C); // [1, 2, 4] } }
普通遍历写法(兼容低版本Java)
import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; public class SplitList { public static void main(String[] args) { ArrayList<Integer> A = new ArrayList<>(Arrays.asList(1,2,5,2,4,2,1,3,6,1,4)); Map<Integer, Integer> countMap = new HashMap<>(); // 遍历统计频次 for (Integer num : A) { countMap.put(num, countMap.getOrDefault(num, 0) + 1); } List<Integer> B = new ArrayList<>(); List<Integer> C = new ArrayList<>(); // 按频次分组 for (Map.Entry<Integer, Integer> entry : countMap.entrySet()) { if (entry.getValue() == 1) { B.add(entry.getKey()); } else { C.add(entry.getKey()); } } // 验证输出 System.out.println(B); // [5, 3, 6] System.out.println(C); // [1, 2, 4] } }
内容的提问来源于stack exchange,提问作者user16303509
相关产品推荐
相关产品推荐

