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

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]);
    }
    
}
}

问题:运行该代码后,无法看到新数组的元素输出,请排查代码错误。


错误分析与修正

核心错误点

  1. 新数组内存未正确分配
    你先初始化了newArray = new int[sizeOfTheNewArray];,此时sizeOfTheNewArray为0,数组长度固定为0。后续计算出正确的去重后元素数量,却没有重新给newArray分配对应长度的内存,导致无法存储元素,最终输出时数组无内容。

  2. 去重逻辑完全错误
    当前逻辑是检查元素在后续位置是否重复,仅保留后续无重复的元素,这和需求完全相悖。需求要求保留元素的首次出现,比如示例中的第一个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 16:37:16