【发布时间】:2019-07-25 04:49:31
【问题描述】:
我有一个编程任务,我必须在其中创建一个方法,该方法接收一个拆分为子数组的数组,然后合并它们。我的方法工作正常,但在“a”中传递的整数数组仅从方法内部更改,从外部保持不变。
在谷歌上查看后,我得出的结论是不可能更改数组参数,但后来我想到了 Arrays.sort,它最终会从方法外部更改数组参数。
如何更改作为参数传入的数组,使其在方法之外保持更改?
/**
* Merge three sorted arrays with these ranges [lo..mid1], [mid1+1..mid2], [mid2+1..hi] into one sorted array.
* Array a has the original input and final sorted input.
* Array aux is the auxiliary array.
*/
public static void Merge(Integer[] a, int lo, int mid1, int mid2, int hi, Integer[] aux) {
int[] arr1 = copyArray(a, lo, mid1);
int[] arr2 = copyArray(a, mid1+1, mid2);
int[] arr3 = copyArray(a, mid2+1, hi);
int i = 0, j = 0, k = 0, idx = 0;
while(i < arr1.length-1 || j < arr2.length-1 || k < arr3.length-1) {
// arr1[i] is the smallest
if(arr1[i] <= arr2[j] && arr1[i] <= arr3[k]) {
System.out.println("i is bigger at " + arr1[i]);
aux[idx] = arr1[i];
i++;
}
// arr2[j] is the smallest
else if(arr2[j] <= arr1[i] && arr2[j] <= arr3[k]) {
System.out.println("j is bigger at " + arr2[j]);
aux[idx] = arr2[j];
j++;
}
// arr3[k] is the smallest
else if(arr3[k] <= arr2[j] && arr3[k] <= arr1[i]) {
System.out.println("k is bigger at " + arr3[k]);
aux[idx] = arr3[k];
k++;
}
idx++;
}
System.out.println(Arrays.toString(arr1));
System.out.println(Arrays.toString(arr2));
System.out.println(Arrays.toString(arr3));
System.out.println(Arrays.toString(aux));
a = aux;
a[0] = 900;
System.out.println("a from Merge method: " + Arrays.toString(a));
}
【问题讨论】:
-
你必须改变每一个元素,就像你对
aux所做的那样:aux[idx] = arr3[k];这样的赋值是行不通的a = aux;,因为Java是按值传递的。 (在 Google 上查找。)
标签: java arrays parameter-passing