簡體   English   中英

創建一種方法,將 2 arrays 合並到一個按升序排序的數組中 Java

[英]Creating a method that merges 2 arrays into one sorted array in ascending order in Java

對於作業的一部分,我必須創建一種方法,將 2 arrays 按升序合並到一個排序數組中。 我已經完成了大部分工作,但是我遇到了一個錯誤,它將數組中的最后一個元素替換為 0。有沒有人遇到過這個問題並知道解決方案? 這是我的代碼:

     public static OrderedArray merge(OrderedArray src1, OrderedArray src2) {

         int numLength1 = src1.array.length;
         int numLength2 = src2.array.length;
         
         //combined array lengths
         int myLength = (numLength1 + numLength2);
        // System.out.println(myLength);
         OrderedArray mergedArr = new OrderedArray(myLength);
         
         //new array
         long[] merged = new long[myLength];
         
         //loop to sort array
         int i = 0;
         int j = 0;
         int k = 0;
         while (k < src1.array.length + src2.array.length - 1) {
             if(src1.array[i] < src2.array[j]) {
                 merged[k] = src1.array[i];
             i++;
             }
             else {
                merged[k] = src2.array[j];
             j++;
                 
             }
            k++; 
            
         }
         
         //loop to print result
         for(int x = 0; x < myLength; x++) {
             System.out.println(merged[x]);
         }
         return mergedArr;
     }

    public static void main(String[] args) {
        int maxSize = 100; // array size
//      OrderedArray arr; // reference to array
        OrderedArray src1 = new OrderedArray(4);
        OrderedArray src2 = new OrderedArray(5);


        
//      arr = new OrderedArray(maxSize); // create the array
        
        
        src1.insert(1);  //insert src1
        src1.insert(17);
        src1.insert(42);
        src1.insert(55);
    
        
        src2.insert(8); //insert src2
        src2.insert(13);
        src2.insert(21);
        src2.insert(32);
        src2.insert(69);
        
        OrderedArray myArray = merge(src1, src2);

這是我預期的 output:

1
8
13
17
21
32
42
55
69

這是我現在的 output:

1
8
13
17
21
32
42
55
0

在合並兩個 arrays 時,您正在對它們進行比較、排序和合並,但是如果兩個 arrays 的長度不同,如 Array1{1,3,8} 和 Array2{4,5,9,10,11} 怎么辦。 這里我們將兩個arrays進行比較,並將指針向前移動,但是當指針到達array1中的8和array2中的9時,現在我們不能向前比較,所以我們將添加剩余的排序數組;

解決方案:-

(在循環之間添加此代碼以對數組進行排序和循環以打印數組)

        while (i < numLength1) {
            merged[k] = src1.array[i];
            i++;
            k++;
        }

        while (j < numLength2) {
            merged[k] = src2.array[j];
            j++;
            k++;
        }

要回答您的主要問題,目標數組的長度是src1.array.length + src2.array.length ,因此您的循環條件應該是以下之一:

  • while (k < src1.array.length + src2.array.length) {
  • while (k <= src1.array.length + src2.array.length - 1) {

否則,您永遠不會為最后一個元素設置值,其中k == src1.array.length + src2.array.length - 1

但是,根據您測試代碼的全面程度,您可能會發現遇到更大的問題: ArrayIndexOutOfBoundsException 在嘗試使用任何數組索引之前,例如src1.array[i] ,您需要確保它是有效的。 這種情況:

if(src1.array[i] < src2.array[j]) {

不驗證isrc1.array的有效索引或jsrc2.array的有效索引。 當一個數組已被完全消耗時,檢查此條件將導致您的程序失敗。 您可以通過輸入 arrays 看到這一點,例如{ 1, 2 } & { 1 }

此代碼修訂版進行了適當的邊界檢查:

if (i >= src1.array.length) {
    // src1 is fully consumed
    merged[k] = src2.array[j];
    j++;
} else if (j >= src2.array.length || src1.array[i] < src2.array[j]) {
    // src2 is fully consumed OR src1's next is less than src2's next
    merged[k] = src1.array[i];
    i++;
} else {
    merged[k] = src2.array[j];
    j++;
}

請注意,我們不需要在第一個條件下檢查j因為i >= src1.array.length意味着j是一個安全值,因為你的循環條件和你如何遞增這些變量的數學:

  • k == i + j由於 k 的遞增和 i & j 的互斥遞增之間的奇偶校驗
  • k < src1.array.length + src2.array.length由於循環條件
  • 因此i + j < src1.array.length + src2.array.length

如果i >= src1.array.lengthj >= src2.array.lengthi + j >= src1.array.length + src2.array.length違反了上述事實。

其他幾點和需要考慮的事情:

  • 與引用數據的方式保持一致。 如果您有變量,請使用它們。 使用numLength1 & numLength2或使用src1.length & src2.length 使用myLength或使用src1.array.length + src2.array.length
  • merge方法真的應該 output 它自己的結果,還是調用該方法的代碼 ( main ) 處理所有輸入 & output?
  • OrderedArray class 是否可以安全地信任為“已訂購”,如果您可以直接訪問其內部數據(如src1.array )並對數組進行修改,它是否正常工作?

合並兩個沒有重復項的 arrays 的最佳方法是將它們都插入到 treeSet 中,如下所示:

  public static int[] merge(int[] src1, int[] src2) {
        TreeSet<Integer> mergedArray= new TreeSet<>();
        for (int i = 0; i < src1.length; i++) {
            mergedArray.add(src1[i]);
        }
        for (int i = 0; i < src2.length; i++) {
            mergedArray.add(src2[i]);
        }
        return mergedArray.stream().mapToInt(e->(int)e).toArray();

    }

public static void main(String[] argh) {
    int[] src1 = {1,17,42,55};
    int[] src2 = {8,13,21,32,69};
Arrays.stream(merge(src1,src2)).forEach(s-> System.out.println(s));
  }

output:

1
8
13
17
21
32
42
55
69

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM