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

Java数组去重方法问题排查:保留顺序但结果异常

问题分析与修正方案

先说说你代码里的几个核心问题:

  • 重复标记逻辑错误:你发现array[j] == array[i]时,把isUnique[j]和isUnique[i]都设为false,这会把第一次出现的元素也标记成非唯一。我们要的是保留第一次出现的元素,后续重复的才标记为非唯一,所以只需要把isUnique[i]设为false就行。
  • 唯一元素计数遗漏:numOfUnique初始为0,循环从i=1开始统计,完全没算第一个元素(索引0)。不管第一个元素会不会重复,它都是第一次出现,正确的做法是遍历整个isUnique数组统计数量,避免遗漏。
  • 新数组未填充元素:你创建了nonDuplicateArray但没把符合条件的元素放进去,Java数组默认值是0,所以输出会有多余的0。

修正后的代码

import java.util.Arrays;

public static int[] eliminateDuplicates(int[] array) {
    if (array == null || array.length == 0) {
        return new int[0];
    }

    // 标记每个元素是否是第一次出现
    boolean[] isUnique = new boolean[array.length];
    Arrays.fill(isUnique, true);

    // 遍历数组,标记后续出现的重复元素
    for (int i = 1; i < array.length; i++) {
        for (int j = 0; j < i; j++) {
            if (array[j] == array[i]) {
                isUnique[i] = false;
                break; // 找到重复就停止内层循环,提升效率
            }
        }
    }

    // 统计唯一元素的准确数量
    int numOfUnique = 0;
    for (boolean unique : isUnique) {
        if (unique) {
            numOfUnique++;
        }
    }

    // 填充去重后的新数组
    int[] nonDuplicateArray = new int[numOfUnique];
    int index = 0;
    for (int i = 0; i < array.length; i++) {
        if (isUnique[i]) {
            nonDuplicateArray[index++] = array[i];
        }
    }

    return nonDuplicateArray;
}

代码说明

  1. 边界处理:先判断数组是否为空或null,直接返回空数组,避免后续逻辑报错。
  2. 重复标记:仅将后续出现的重复元素标记为false,第一次出现的元素保持true,严格保留原数组的出现顺序。
  3. 准确计数:遍历整个isUnique数组统计唯一元素数量,不会遗漏任何第一次出现的元素。
  4. 填充数组:按原数组顺序遍历,将标记为true的元素依次放入新数组,保证结果顺序与原数组中元素首次出现的顺序一致。

用你提供的测试数组[2,10,4,4,10,8,2,10,4,6]测试,返回的数组会是[2,10,4,8,6],完全符合去重且保序的要求。

内容的提问来源于stack exchange,提问作者Ozan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 21:52:44