如何创建一个数组,其中元素按照其在原始数组中第一次出现的顺序排列?

问题描述 投票:0回答:2

任务是创建第二个数组,其中每个数字仅包含一次。但是,顺序应与原始数组中第一次出现的顺序相对应。解数组在主程序中输出。

我已经编写了这段代码:

public static int[] sortSecArr (int[] arr){
   int dumpArr[] = new int[arr.length];
   for(int i = 0; i < arr.length; i++){
      for(int j = 0; j < arr.length; j++){
         if(arr[i] == arr[j]){
            dumpArr[i] = arr[i] ;
         }
      }     
   }
   return dumpArr;
}

我尝试将其分成两个for循环,然后将

arr[i]
arr[j]
进行比较,当它不同时,它应该进入
dumpArr

我知道有些问题,但不知道这段代码需要更改什么。

java arrays sorting
2个回答
1
投票

您正在做的是从相同的索引开始进行比较 - 这是第一个错误 - 然后将项目添加到哑数组(如果存在) - 这是第二个错误。

您可以使用 HashSet 来帮助您确定唯一性,使用 List 来帮助您确定顺序并创建一个比所需大小更大的数组,然后将其转换为这样的数组:

public static int[] sortSecArr(int[] arr) {
   Set<Integer> set = new HashSet<>();
   List<Integer> uniqueList = new ArrayList<>();
        
   for (int num : arr) {
      if (!set.contains(num)) {
         uniqueList.add(num);
         set.add(num);
      }
   }
        
   // Convert ArrayList to array
   int[] uniqueArray = new int[uniqueList.size()];
   for (int i = 0; i < uniqueList.size(); i++) {
      uniqueArray[i] = uniqueList.get(i);
   }
        
   return uniqueArray;
}

不使用HashSet解决它

    public static int[] sortSecArr(int[] arr) {
        int uniqueCount = 0;

        // Count the number of unique elements
        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++;
            }
        }

        // Create the array to store unique elements
        int[] uniqueArray = new int[uniqueCount];
        int index = 0;

        // Add unique elements to the unique array
        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) {
                uniqueArray[index++] = arr[i];
            }
        }

        return uniqueArray;
    }

0
投票

如果你可以使用动态数组,你可以这样做(我用Python编写的,但你可以使用例如java

ArrayList

def solve(a: list[int]) -> list[int]:
    answer = []
    for number in a:
        if number not in answer:
            answer.append(number)
    return answer

assert solve([1, 1, 2, 1, 2, 5, 6, 2, 3, 1]) == [1, 2, 5, 6, 3]
assert solve([]) == []
assert solve([1, 2, 3]) == [1, 2, 3]
assert solve([1, 1, 1]) == [1]
assert solve([1, 2, 1, 2]) == [1, 2]

在java函数签名中将是:

public static ArrayList<Integer> solve(int[] arr);

如果您需要返回

int[]
,您需要计算输入数组中有多少个唯一元素。您可以使用
set
hashmap

来完成此操作

如果您不允许使用地图、集合等,您可以:

  1. 根据输入长度分配零数组
  2. 使用
    i
    迭代 arr,使用
    j
    迭代新 arr
  3. 迭代arr:
int new_arr[] = new int[arr.length()];
int j_max;
while (i < arr.length()){
    if arr[i] not in new_arr then
        new_arr[j++] = arr[i++]
        j_max = j
    else
        i++
}

这是伪代码

  1. 您需要返回 new_arr 从 0 到 j_max-1 的切片
return Arrays.copyOfRange(new_arr, 0, j_max-1);
© www.soinside.com 2019 - 2024. All rights reserved.