上一篇                     
               
			  java 怎么筛选值相同
- 后端开发
- 2025-07-16
- 4646
 Java中,可以使用
 
 
Stream API结合
 filter方法筛选值相同的元素,使用
 Map收集频率,再过滤出出现次数大于1的值,以下是示例代码:,“`java,List list = Arrays.asList(1, 2, 2, 3, 3, 3);,Map frequencyMap = list.stream(), .collect(Collectors.groupingBy(e -> e, Collectors.counting()));,List duplicates = frequencyMap.entrySet().stream(), .filter(entry -> entry.getValue() > 1), .map(Map.Entry::getKey), .collect(Collectors.toList());,
Java编程中,筛选出值相同的元素是一个常见的需求,无论是在数组、列表还是其他集合中,都有多种方法可以实现这一目标,下面将详细介绍几种常用的方法,包括使用传统循环、Java 8的Stream API以及利用集合的特性来筛选值相同的元素。
使用传统循环遍历数组或列表
示例:筛选数组中重复的元素
假设我们有一个整数数组,想要找出其中所有重复的值,可以通过嵌套循环来实现:
public class DuplicateElements {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3, 2, 4, 5, 3, 6};
        List<Integer> duplicates = new ArrayList<>();
        for (int i = 0; i < numbers.length; i++) {
            for (int j = i + 1; j < numbers.length; j++) {
                if (numbers[i] == numbers[j] && !duplicates.contains(numbers[i])) {
                    duplicates.add(numbers[i]);
                }
            }
        }
        System.out.println("重复的元素有: " + duplicates);
    }
} 
输出:
重复的元素有: [2, 3]说明
- 外层循环遍历数组中的每个元素。
- 内层循环检查当前元素之后的所有元素是否有相同的值。
- 使用duplicates列表来存储已经发现的重复元素,避免重复添加相同的元素。
使用HashMap统计元素出现次数
通过使用HashMap,我们可以有效地统计每个元素出现的次数,然后筛选出出现次数大于1的元素。
import java.util.;
public class DuplicateElementsUsingMap {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3, 2, 4, 5, 3, 6};
        Map<Integer, Integer> countMap = new HashMap<>();
        // 统计每个元素的出现次数
        for (int num : numbers) {
            countMap.put(num, countMap.getOrDefault(num, 0) + 1);
        }
        // 筛选出出现次数大于1的元素
        List<Integer> duplicates = new ArrayList<>();
        for (Map.Entry<Integer, Integer> entry : countMap.entrySet()) {
            if (entry.getValue() > 1) {
                duplicates.add(entry.getKey());
            }
        }
        System.out.println("重复的元素有: " + duplicates);
    }
} 
输出:

重复的元素有: [2, 3]说明
- 统计阶段:遍历数组,使用HashMap记录每个元素出现的次数。
- 筛选阶段:遍历HashMap,将出现次数大于1的元素添加到duplicates列表中。
使用Java 8 Stream API
Java 8引入的Stream API提供了一种更简洁和函数式的方式来处理集合数据,我们可以利用Stream的collect方法结合GroupingBy来分组,并筛选出出现次数大于1的元素。
import java.util.;
import java.util.stream.Collectors;
public class DuplicateElementsUsingStream {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 2, 4, 5, 3, 6);
        // 使用Stream API分组并筛选
        Map<Integer, Long> countMap = numbers.stream()
                .collect(Collectors.groupingBy(n -> n, Collectors.counting()));
        List<Integer> duplicates = countMap.entrySet().stream()
                .filter(entry -> entry.getValue() > 1)
                .map(Map.Entry::getKey)
                .collect(Collectors.toList());
        System.out.println("重复的元素有: " + duplicates);
    }
} 
输出:
重复的元素有: [2, 3]说明
- 分组阶段:groupingBy按元素值进行分组,并使用counting统计每组的数量。
- 筛选阶段:过滤出计数大于1的元素,并收集到duplicates列表中。
使用集合的frequency方法
 
对于Collection类型的数据结构,可以利用Collections.frequency方法来统计元素出现的次数。
import java.util.;
public class DuplicateElementsUsingFrequency {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 2, 4, 5, 3, 6);
        Set<Integer> uniqueNumbers = new HashSet<>(numbers);
        List<Integer> duplicates = new ArrayList<>();
        for (Integer num : uniqueNumbers) {
            if (Collections.frequency(numbers, num) > 1) {
                duplicates.add(num);
            }
        }
        System.out.println("重复的元素有: " + duplicates);
    }
} 
输出:

重复的元素有: [2, 3]说明
- 去重:首先将列表转换为Set,去除重复元素。
- 统计频率:遍历Set,使用Collections.frequency统计每个元素在原列表中的出现次数。
- 筛选:将出现次数大于1的元素添加到duplicates列表中。
综合比较
| 方法 | 优点 | 缺点 | 
|---|---|---|
| 传统循环 | 简单直观,适用于任何Java版本 | 代码冗长,效率较低 | 
| 使用HashMap统计 | 高效,适用于大数据量 | 需要手动管理Map | 
| Java 8 Stream API | 代码简洁,函数式编程风格 | 需要熟悉Stream API | 
| 使用Collections.frequency | 简单易用,适合小数据量 | 对于大数据量性能较差 | 
FAQs
Q1: 如何在Java中查找列表中所有重复的元素?
A1: 可以使用多种方法来查找列表中所有重复的元素,以下是两种常用的方法:
-  使用HashMap统计出现次数: Map<Integer, Integer> countMap = new HashMap<>(); for (Integer num : list) { countMap.put(num, countMap.getOrDefault(num, 0) + 1); } List<Integer> duplicates = countMap.entrySet().stream() .filter(entry -> entry.getValue() > 1) .map(Map.Entry::getKey) .collect(Collectors.toList());
-  使用Java 8 Stream API分组并筛选: Map<Integer, Long> countMap = list.stream() .collect(Collectors.groupingBy(n -> n, Collectors.counting())); List<Integer> duplicates = countMap.entrySet().stream() .filter(entry -> entry.getValue() > 1) .map(Map.Entry::getKey) .collect(Collectors.toList());
Q2: 如果我想找出数组中只出现一次的元素,应该怎么做?
A2: 要找出数组中只出现一次的元素,可以采用以下方法:

-  使用HashMap统计出现次数,然后筛选出次数为1的元素: Map<Integer, Integer> countMap = new HashMap<>(); for (Integer num : array) { countMap.put(num, countMap.getOrDefault(num, 0) + 1); } List<Integer> unique = countMap.entrySet().stream() .filter(entry -> entry.getValue() == 1) .map(Map.Entry::getKey) .collect(Collectors.toList());
-  使用Java 8 Stream API: Map<Integer, Long> countMap = Arrays.stream(array) .boxed() .collect(Collectors.groupingBy(n -> n, Collectors.counting())); List<Integer> unique = countMap.entrySet().stream() .filter(entry -> entry.getValue() == 1) .map(Map.Entry::getKey) .collect(Collectors.toList());
 
  
			