如何创建按原数组首次出现顺序排列的唯一元素数组?
修复去重并保留首次出现顺序的Java方法
你的代码核心问题在于完全没实现去重逻辑:两层循环只是把每个元素重复赋值到dumpArr对应位置,最后得到的数组和原数组几乎一样(甚至因为int数组默认值0,可能多出来无效值),根本没过滤重复元素,也没处理结果数组的长度问题。
问题拆解
- 循环逻辑错误:只要
arr[i] == arr[j]就赋值,这会把所有元素(包括重复的)都塞进dumpArr,完全没判断元素是否已经被保留过。 dumpArr长度和原数组一致,去重后元素数量肯定更少,多余位置会填充默认值0,不符合要求。- 没有记录哪些元素已经被添加到结果里,无法判断当前元素是否是首次出现。
方案一:用集合实现(简洁高效)
利用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
相关产品推荐
相关产品推荐

