[英]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]) {
不驗證i
是src1.array
的有效索引或j
是src2.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.length
和j >= src2.array.length
則i + 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.