Java如何标记数组已打印元素 避免非唯一值及频次重复输出
Java数组非唯一元素统计去重打印解决方案
问题根因
你当前代码重复打印的核心逻辑缺陷是:遍历数组时每遇到一个重复元素,都会执行一次计数和打印逻辑,比如元素2在数组中出现3次,遍历到这3个2的位置时会分别打印3次相同的2 -> 3结果。
方案1:不引入额外数据结构,修改原有双层循环逻辑
可以新增前置判断逻辑,只在元素第一次出现的时候才做计数和打印,后续再遇到相同元素直接跳过即可:
int N = A.length; int nonUniqueTotal = 0; // 统计非唯一元素的总个数 for (int i = 0; i < N; i++) { // 先判断当前元素在之前的位置有没有出现过,出现过就直接跳过本次循环 boolean isExisted = false; for (int k = 0; k < i; k++) { if (A[i] == A[k]) { isExisted = true; break; } } if (isExisted) continue; // 仅第一次出现的元素才统计频次 int count = 0; for (int j = 0; j < N; j++) { if (A[i] == A[j]) count++; } if (count > 1) { nonUniqueTotal++; System.out.println(A[i] + " -> " + count); } } System.out.println("非唯一元素的数量:" + nonUniqueTotal);
该方案时间复杂度为O(n²),适合数组长度不大的场景。
方案2:基于HashMap实现,时间复杂度更低(O(n))
如果数组长度较大,推荐用哈希表统计频次,只需遍历两次数组即可完成需求,运行效率更高:
import java.util.HashMap; import java.util.Map; // 方法内部实现代码 Map<Integer, Integer> freqMap = new HashMap<>(); int N = A.length; // 第一次遍历统计所有元素的出现频次 for (int num : A) { freqMap.put(num, freqMap.getOrDefault(num, 0) + 1); } int nonUniqueTotal = 0; // 第二次遍历直接输出非唯一元素的频次 for (Map.Entry<Integer, Integer> entry : freqMap.entrySet()) { int count = entry.getValue(); if (count > 1) { nonUniqueTotal++; System.out.println(entry.getKey() + " -> " + count); } } System.out.println("非唯一元素的数量:" + nonUniqueTotal);
内容的提问来源于stack exchange,提问作者JG98
相关产品推荐
相关产品推荐

