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; }
代码说明
- 边界处理:先判断数组是否为空或null,直接返回空数组,避免后续逻辑报错。
- 重复标记:仅将后续出现的重复元素标记为
false,第一次出现的元素保持true,严格保留原数组的出现顺序。 - 准确计数:遍历整个
isUnique数组统计唯一元素数量,不会遗漏任何第一次出现的元素。 - 填充数组:按原数组顺序遍历,将标记为
true的元素依次放入新数组,保证结果顺序与原数组中元素首次出现的顺序一致。
用你提供的测试数组[2,10,4,4,10,8,2,10,4,6]测试,返回的数组会是[2,10,4,8,6],完全符合去重且保序的要求。
内容的提问来源于stack exchange,提问作者Ozan
相关产品推荐
相关产品推荐

