
本文详解如何手动实现数组元素去重,保留首次出现的顺序,不依赖 hashset、arraylist 等高级容器,仅用基础数组和循环逻辑完成任务,并修复常见初始化与逻辑错误。
本文详解如何手动实现数组元素去重,保留首次出现的顺序,不依赖 hashset、arraylist 等高级容器,仅用基础数组和循环逻辑完成任务,并修复常见初始化与逻辑错误。
在 Java 中实现“去除重复元素但保持原始顺序”的功能时,一个典型误区是提前声明目标数组却未正确预估其长度——如原代码中 int sizeOfTheNewArray = 0; int[] newArray = new int[sizeOfTheNewArray]; 导致 newArray 永远为长度为 0 的空数组,后续任何赋值操作(如 newArray[j] = ...)都会触发 ArrayIndexOutOfBoundsException 或静默失败,最终输出为空。
要正确解决该问题,需分三步严谨处理:
- 准确统计唯一元素个数;
- 基于统计结果创建合适容量的新数组;
- 再次遍历原数组,按首次出现原则填充新数组。
以下是完整、可运行的解决方案(无任何 java.util.* 集合类,仅用 Scanner 和基础数组):
import java.util.Arrays;
import java.util.Scanner;
public class PassElementToAnotherArray {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int[] arr = readArray(scanner);
System.out.printf("Before: %s%n", Arrays.toString(arr));
int[] uniqueArr = getUniqueElements(arr);
System.out.printf("After: %s%n", Arrays.toString(uniqueArr));
}
// 从控制台读取逗号分隔的整数序列,构建数组
public static int[] readArray(Scanner scanner) {
System.out.println("Please enter your array values (e.g., 3, 3, 87, 56, 1, 87, 3, 2):");
String line = scanner.nextLine().trim();
if (line.isEmpty()) {
return new int[0];
}
String[] tokens = line.split(",");
int[] array = new int[tokens.length];
for (int i = 0; i <p>✅ <strong>关键设计说明</strong>: </p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill3430" title="Alibabacloud Sdk Client Initialization For Java"><img
src="https://img.php.cn/upload/skill/000/000/081/178955835420587.jpg" alt="Alibabacloud Sdk Client Initialization For Java" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill3430" title="Alibabacloud Sdk Client Initialization For Java" class="overflowclass">Alibabacloud Sdk Client Initialization For Java</a>
<p class="overflowclass">在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。</p>
</div>
<a rel="nofollow" href="/xiazai/skill3430" title="Alibabacloud Sdk Client Initialization For Java" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
- 使用带标签的
outer循环替代嵌套break/continue的歧义逻辑,提升可读性与可控性; -
countUniqueElements和getUniqueElements复用同一判定逻辑(检查i之前是否已存在相同值),保证语义一致; - 输入支持人工键入(如
"3, 3, 87, 56, 1, 87, 3, 2"),更贴合题目意图,而非依赖随机生成; - 所有边界情况(空输入、单元素、全重复)均被自然覆盖。
⚠️ 常见错误规避提醒:
- ❌ 不可在声明数组前将长度设为 0 或未计算值;
- ❌ 不应在内层循环中反复修改标志变量(如原代码中
isIt = false被多次覆盖导致逻辑失效); - ❌ 不应试图在未扩容的数组上执行越界写入(如
newArray[j] = ...当j >= newArray.length); - ✅ 正确做法是:先确定容量 → 再创建数组 → 最后填充,三阶段解耦,职责清晰。
运行示例:
Please enter your array values (e.g., 3, 3, 87, 56, 1, 87, 3, 2): 3, 3, 87, 56, 1, 87, 3, 2 Before: [3, 3, 87, 56, 1, 87, 3, 2] After: [3, 87, 56, 1, 2]
该方案完全满足题目要求:不调用 Arrays.stream()、Set、List 等现成工具,纯手工实现逻辑,保持元素相对顺序,且代码健壮、易理解、可维护。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










