
本文详解如何修正 eliminateDuplicates 方法,避免返回含 -1 占位符的数组,通过构建动态新数组实现真正去重,并提供完整可运行示例与关键注意事项。
本文详解如何修正 `eliminateduplicates` 方法,避免返回含 `-1` 占位符的数组,通过构建动态新数组实现真正去重,并提供完整可运行示例与关键注意事项。
在原始代码中,eliminateDuplicates 方法仅用 -1 标记重复元素,但未真正压缩数组——这导致主程序遍历时仍会输出 -1,违背“返回新数组且仅含不重复值”的要求。根本问题在于:数组长度固定,无法直接删除元素;必须创建容量精确的新数组。
正确的解决思路是两步走:
- 识别所有唯一值(跳过已出现过的数);
- 一次性构造结果数组,长度等于唯一值个数。
以下是优化后的完整实现(已修正逻辑错误、提升可读性与健壮性):
import java.util.Scanner;
public class Lab09 {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("Enter ten numbers: ");
int[] num = new int[10];
for (int i = 0; i < num.length; i++) {
num[i] = s.nextInt();
}
int[] result = eliminateDuplicates(num); // 接收新数组,不修改原数组
System.out.print("The distinct numbers are: ");
for (int i = 0; i < result.length; i++) {
System.out.print(result[i] + " ");
}
System.out.println(); // 换行收尾
s.close();
}
public static int[] eliminateDuplicates(int[] list) {
if (list == null || list.length == 0)
return new int[0]; // 边界处理
// 第一步:统计唯一元素个数
int uniqueCount = 0;
for (int i = 0; i < list.length; i++) {
boolean isDuplicate = false;
// 检查 list[i] 是否在 list[0..i-1] 中已存在
for (int j = 0; j < i; j++) {
if (list[i] == list[j]) {
isDuplicate = true;
break;
}
}
if (!isDuplicate) uniqueCount++;
}
// 第二步:创建结果数组并填充
int[] result = new int[uniqueCount];
int index = 0;
for (int i = 0; i < list.length; i++) {
boolean isDuplicate = false;
for (int j = 0; j < i; j++) {
if (list[i] == list[j]) {
isDuplicate = true;
break;
}
}
if (!isDuplicate) {
result[index++] = list[i];
}
}
return result;
}
}✅ 关键改进说明:
立即学习“Java免费学习笔记(深入)”;
- 不修改原数组:eliminateDuplicates 返回全新数组,符合方法契约;
- 避免 -1 占位:全程不引入任何魔法值(如 -1),逻辑清晰;
- 时间复杂度可控:O(n²),对 10 个数完全适用;若需更高性能,后续可升级为 HashSet(O(n));
- 强健性增强:增加 null 和空数组校验,防止运行时异常。
⚠️ 注意事项:
- 原始方案中“先标 -1 再排序过滤”的做法不仅低效,且破坏原始顺序(题目未要求排序);本解法严格保持首次出现顺序,更符合实际需求;
- 不要复用 list 数组作为结果容器——Java 数组不可变长,强行覆盖会导致逻辑混乱;
- 若输入含负数(如 -5, -10),用 -1 标记将引发严重误判,因此绝对避免使用特殊值标记。
总结:数组去重的本质是“筛选+重构”,而非“打标+清理”。掌握这一思想,即可举一反三处理字符串去重、对象去重等同类问题。

















