You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 12:48:01