【问题标题】:Java: How to change an Integer array parameter from inside a methodJava:如何从方法内部更改整数数组参数
【发布时间】: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


【解决方案1】:

您可以将 void 更改为 int[][] 然后返回数组

public static int[][] Merge(arguments) {
    //Do math
    int[][] result = new int[][] {arr1, arr2, arr3};
    return result;
}

然后,在您调用它的方法之外,如下所示:

int[][] integerArray = Merge(arguments);
arr1 = integerArray[0];
arr2 = integerArray[1];
arr3 = integerArray[2];

【讨论】:

    【解决方案2】:

    您必须遍历辅助数组并将值分配给“a”数组:

    a[i] = aux[i]
    

    或者返回你的合并数组作为结果。

    public static int[] Merge(int[] a, int mid1, ...){
       // do something
      return a;
    }
    

    【讨论】:

      猜你喜欢
      • 2022-11-27
      • 2013-04-23
      • 2021-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-22
      • 2014-03-06
      相关资源
      最近更新 更多