-2

次のコードがあります。

public int[][][] arrMethod1(){
    for (int idx=0;idx< x;idx++ ){
        arr[idx]=arrMethod2();
        System.out.println("arr "+idx+" is "+Arrays.toString(arr[idx][0]));
        }
    System.out.println("arr0 are "+Arrays.toString(arr[0][0]));
    System.out.println("arr1 are "+Arrays.toString(arr[1][0]));
    return arr;
}

このコードを実行すると、for ループ内と外側で異なる結果が生成されます。は for ループ内では当てはまらないarr[0][0]と同じようです。arr[1][0]myMethod() はarr[idx]、2D 配列で初期化するメソッドです。私のテストではx=2、簡単にするために 1D 配列を使用しました。目的は、3D 配列をx異なるものにすることです。arrコードの残りの部分:

private final int[][] arrMethod2(){ 
    final int[] otherArr=arrMethod3();
        for (int idz=0;idz< z;idz++ ){
            int[] toBe=new int[otherArr.length];
            System.arraycopy( otherArr, 0, toBe, 0, otherArr.length );
            newArr2[idz]=change(toBe);
    }
    return newArr2;
}

public int[] arrMethod3(){
    for (int idy = 0; idy < y; idy++){
          double randomInt = randomGenerator.nextDouble();
          newArr3[idy]=(int) Math.round(randomInt);
    }
    return newArr3;

public MyClass(int x,int y, int z){
    this.x=x;
    this.y=y;
    this.z=z;
    this.newArr3 = new int[y];
    this.newArr2 = new int[z][y];
    this.arr = new int[x][z][y];
}
4

3 に答える 3

1

コードは、最も内側の配列 (newArr3) を 1 回だけ作成し、その配列内の値のみを変更します。呼び出しごとに新しいものを作成する必要があります。

メソッド arrMethod3 を次のように変更します。

public int[] arrMethod3(){
   int[] retVal = new int[y]; // THIS IS THE IMPORANT LINE
   for (int idy = 0; idy < y; idy++){
      double randomInt = randomGenerator.nextDouble();
      retVal[idy]=(int) Math.round(randomInt);
   }
   return retVal;
}

newArr2(in )に対しても同じことを行う必要がありarrMethod2ます。

その理由は、既に渡した値を上書きするためです。このような:

  • 初期化クラス、配列の定義
  • 最初にループを実行し、すべての配列の各要素に値を割り当てます
  • 2 回目の実行では、すべての配列の各要素に値を割り当て、古いものを上書きします。

しかし、あなたがする必要があるのは:

  • init クラスで、外側の配列を定義します (最も外側の配列のみ!)
  • 外側のループは外側の配列をアドレス指定し、内側のメソッドを呼び出します
    • 内部メソッドは新しい配列を作成し、新しいデータで埋めます

そうすれば、内部メソッドを呼び出すたびに新しい配列が作成されます。

部屋のある家のように考えてください。家を通り抜けて各部屋に机を置き、同じ家をもう一度通り抜けて机をスツールに置き換えると、各部屋にはちょうど1つのものを入れることができます。そうすれば、最終的にはスツールでいっぱいの家になります。

代わりに家を机で埋め、次の家に行ってスツールで満たすと、内容の異なる家が 2 つできます。

(この例では、部屋は arrMethod3、家は arrMethod2、外側の配列は通りです)

于 2013-06-20T10:02:56.730 に答える
0

明確にするために、あなたの説明から正しく理解できれば、ループの外側arr[0][0] & arr[1][0]は等しいです。これは、ループ内でも等しいことを意味します。しかし、あなたが言っていることは間違っています。つまり、arr[0][0] == arr[1][0]という意味ではありませんarr[0] = arr[1]。これは、これら 2 つの配列の 0 番目の要素が等しいことを意味します。それはあなたの質問に答えていますか?または少なくともそれを明確にしますか?

于 2013-06-20T10:01:50.147 に答える