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

如何创建按原数组首次出现顺序排列的唯一元素数组?

修复去重并保留首次出现顺序的Java方法

你的代码核心问题在于完全没实现去重逻辑:两层循环只是把每个元素重复赋值到dumpArr对应位置,最后得到的数组和原数组几乎一样(甚至因为int数组默认值0,可能多出来无效值),根本没过滤重复元素,也没处理结果数组的长度问题。

问题拆解

  1. 循环逻辑错误:只要arr[i] == arr[j]就赋值,这会把所有元素(包括重复的)都塞进dumpArr,完全没判断元素是否已经被保留过。
  2. dumpArr长度和原数组一致,去重后元素数量肯定更少,多余位置会填充默认值0,不符合要求。
  3. 没有记录哪些元素已经被添加到结果里,无法判断当前元素是否是首次出现。

方案一:用集合实现(简洁高效)

利用HashSet快速判断元素是否已存在,ArrayList动态存储去重后的元素,最后转成int数组:

import java.util.ArrayList;
import java.util.HashSet;

public static int[] sortSecArr(int[] arr) {
    HashSet<Integer> seen = new HashSet<>();
    ArrayList<Integer> tempList = new ArrayList<>();
    
    for (int num : arr) {
        // 只有元素没被见过时,才加入列表和集合
        if (!seen.contains(num)) {
            seen.add(num);
            tempList.add(num);
        }
    }
    
    // 将列表转成int数组返回
    int[] result = new int[tempList.size()];
    for (int i = 0; i < tempList.size(); i++) {
        result[i] = tempList.get(i);
    }
    return result;
}

方案二:纯数组实现(无额外依赖)

如果不想用集合,可以通过双层循环检查当前元素之前的所有元素是否重复,先统计不重复元素数量,再创建对应长度的数组:

public static int[] sortSecArr(int[] arr) {
    // 第一步:统计不重复元素的数量
    int uniqueCount = 0;
    for (int i = 0; i < arr.length; i++) {
        boolean isDuplicate = false;
        // 检查当前元素在之前的位置是否已经出现过
        for (int j = 0; j < i; j++) {
            if (arr[i] == arr[j]) {
                isDuplicate = true;
                break;
            }
        }
        if (!isDuplicate) {
            uniqueCount++;
        }
    }
    
    // 第二步:创建结果数组并填充首次出现的元素
    int[] result = new int[uniqueCount];
    int index = 0;
    for (int i = 0; i < arr.length; i++) {
        boolean isDuplicate = false;
        for (int j = 0; j < i; j++) {
            if (arr[i] == arr[j]) {
                isDuplicate = true;
                break;
            }
        }
        if (!isDuplicate) {
            result[index++] = arr[i];
        }
    }
    return result;
}

主程序调用示例

在main方法里调用并输出结果:

public static void main(String[] args) {
    int[] original = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
    int[] uniqueArr = sortSecArr(original);
    
    // 输出去重后的数组
    for (int num : uniqueArr) {
        System.out.print(num + " ");
    }
    // 输出结果:3 1 4 5 9 2 6
}

两种方案对比

  • 集合方案:代码简洁,时间复杂度O(n)(HashSet的contains方法是O(1)),适合处理大数据量的数组。
  • 纯数组方案:不需要引入集合类,适合基础场景,但时间复杂度O(n²),数据量大时效率较低。

内容的提问来源于stack exchange,提问作者Meychilo Blacklegends

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 10:05:00