Java数组去重问题求助:不使用现成方法但新数组无输出
数组按序去重代码错误排查
需求与问题
需求:将输入数组中的元素按原顺序去重(仅保留每个元素的首次出现),生成新数组。示例:输入{3, 3, 87,56,1, 87, 3, 2 },输出应为{3, 87, 56, 1, 2 },要求不使用现成去重方法。
编写的Java代码如下:
import java.util.Arrays; import java.util.Scanner; public class PassElementToAnotherArray { public static void main(String[] args) { // TODO Auto-generated method stub transferElementsOfArray(); } public static int[] createArrays() { Scanner scanner = new Scanner(System.in); System.out.println("Please enter first array size:"); int size = scanner.nextInt(); int[] array = new int[size]; for (int i = 0; i < array.length; i++) { array[i] = (int) (Math.random()*100); } return array; } public static void transferElementsOfArray() { int [] firstArray = createArrays(); System.out.println("Elements of the first array: "); for (int i = 0; i < firstArray.length; i++) { System.out.print(firstArray[i]+" "); } System.out.println(); int sizeOfTheNewArray = 0; int [] newArray = new int[sizeOfTheNewArray]; boolean isIt = false; for (int i = 0; i < firstArray.length; i++) { for (int j = i+1; j < firstArray.length; j++) { if (firstArray[i]==firstArray[j]) { isIt = true; break; } else { isIt = false; } } if (!isIt) { sizeOfTheNewArray++; } } System.out.println(sizeOfTheNewArray); int counter = 0; for (int i = 0; i < firstArray.length; i++) { for (int j = i+1; j < firstArray.length; j++) { if (firstArray[i]==firstArray[j]) { isIt = true; break; } else { isIt = false; } } if (!isIt) { for (int j = counter; j < newArray.length; j++) { newArray[j] = firstArray[i]; break; } counter++; } } for (int i = 0; i < newArray.length; i++) { System.out.println(newArray[i]); } } }
问题:运行该代码后,无法看到新数组的元素输出,请排查代码错误。
错误分析与修正
核心错误点
新数组内存未正确分配
你先初始化了newArray = new int[sizeOfTheNewArray];,此时sizeOfTheNewArray为0,数组长度固定为0。后续计算出正确的去重后元素数量,却没有重新给newArray分配对应长度的内存,导致无法存储元素,最终输出时数组无内容。去重逻辑完全错误
当前逻辑是检查元素在后续位置是否重复,仅保留后续无重复的元素,这和需求完全相悖。需求要求保留元素的首次出现,比如示例中的第一个3应该被保留,但你的逻辑会因为它后面有重复而排除它,直接导致结果错误。
修正后的代码
import java.util.Scanner; public class PassElementToAnotherArray { public static void main(String[] args) { transferElementsOfArray(); } public static int[] createArrays() { Scanner scanner = new Scanner(System.in); System.out.println("Please enter first array size:"); int size = scanner.nextInt(); int[] array = new int[size]; for (int i = 0; i < array.length; i++) { array[i] = (int) (Math.random() * 100); } scanner.close(); // 关闭Scanner避免资源泄漏 return array; } public static void transferElementsOfArray() { int[] firstArray = createArrays(); System.out.println("Elements of the first array: "); for (int num : firstArray) { System.out.print(num + " "); } System.out.println(); // 第一步:统计首次出现的元素数量,确定新数组长度 int sizeOfNewArray = 0; for (int i = 0; i < firstArray.length; i++) { boolean isDuplicate = false; // 检查当前元素在之前的位置是否已出现 for (int j = 0; j < i; j++) { if (firstArray[i] == firstArray[j]) { isDuplicate = true; break; } } if (!isDuplicate) { sizeOfNewArray++; } } // 第二步:初始化新数组并填充去重后的元素 int[] newArray = new int[sizeOfNewArray]; int counter = 0; for (int i = 0; i < firstArray.length; i++) { boolean isDuplicate = false; for (int j = 0; j < i; j++) { if (firstArray[i] == firstArray[j]) { isDuplicate = true; break; } } if (!isDuplicate) { newArray[counter++] = firstArray[i]; } } // 输出去重后的数组 System.out.println("Elements of the deduplicated array: "); for (int num : newArray) { System.out.print(num + " "); } } }
修正说明
- 先计算去重后的元素数量,再初始化对应长度的数组,解决内存分配问题;
- 调整去重逻辑:检查当前元素在之前位置是否已出现,确保保留首次出现的元素;
- 优化遍历写法,同时关闭Scanner避免资源泄漏。
内容的提问来源于stack exchange,提问作者Mustafa BAL
相关产品推荐
相关产品推荐

