如何输出Java整数数组中所有存在重复值的元素?
解决数组中输出所有重复元素全部实例的问题
你的核心需求是:输出数组中所有出现次数≥2的元素的每一个实例——比如原数组里的2出现2次就输出两个2,3出现3次就输出三个3,以此类推。
原代码的问题分析
你最初的双重循环逻辑存在两个关键问题:
- 只会打印当前元素之后的重复项,不会打印当前元素本身。比如第一个2(索引0)会打印第二个2(索引1),但第二个2之后没有其他2,最终只输出一个2,漏掉了第一个2。
- 逻辑冗余:重复元素的前面实例会多次触发打印后面的重复项,虽然最终输出的重复元素数量可能碰巧正确,但逻辑不够高效且容易出错。
而你尝试的另一种方法只输出了每个重复元素的唯一值,没有输出全部实例,也不符合需求。
解决方案:先统计元素出现次数,再遍历输出
我们可以先用HashMap统计数组中每个元素的出现次数,再二次遍历原数组,输出所有出现次数大于1的元素实例。这样既能保留原数组的顺序,又能精准输出所有符合要求的元素。
import java.util.HashMap; import java.util.Map; public class DuplicateElements { public static void main(String[] args) { int[] arr = new int[] {1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 7, 8, 9, 10}; // 第一步:统计每个元素的出现次数 Map<Integer, Integer> countMap = new HashMap<>(); for (int num : arr) { countMap.put(num, countMap.getOrDefault(num, 0) + 1); } // 第二步:遍历原数组,输出出现次数≥2的元素 for (int num : arr) { if (countMap.get(num) > 1) { System.out.print(num + " "); } } } }
输出结果
2 2 3 3 3 4 4 4 4 5 5 5 5 5
逻辑说明
- 统计次数:通过增强for循环遍历数组,用
HashMap的getOrDefault方法快速累加每个元素的出现次数,避免空指针问题。 - 遍历输出:再次遍历原数组,检查当前元素的统计次数,只要次数大于1就输出,完美保留原数组中重复元素的顺序和全部实例。
如果你使用Java 8及以上版本,也可以用Stream API实现更简洁的代码:
import java.util.Arrays; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; public class DuplicateElementsStream { public static void main(String[] args) { int[] arr = new int[] {1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 7, 8, 9, 10}; Map<Integer, Long> countMap = Arrays.stream(arr) .boxed() .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); Arrays.stream(arr) .filter(num -> countMap.get(num) > 1) .forEach(num -> System.out.print(num + " ")); } }
这个版本逻辑和HashMap版本一致,只是用Stream的方式完成统计和过滤,适合熟悉Lambda表达式的场景。
内容的提问来源于stack exchange,提问作者askein
相关产品推荐
相关产品推荐

