-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循环内部和外部会产生不同的结果。似乎arr[0][0]与 相同arr[1][0],这在 for 循环中是不正确的。arr[idx]myMethod() 是一种使用 2D 数组进行初始化的方法。对于我的测试,x=2为了简单起见,我使用了一维数组。目的是拥有x不同arr的 3D 数组。其余代码:

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

如果myMethod不创建新数组 ( new int[][]and new int[]) 而是重用相同的内存对象,则将相同的对象放入arr[0]and arr[1]。始终由新值填充;最后的会覆盖之前的。

于 2013-06-20T09:45:04.457 回答
1

您的代码只创建一次最内层数组 (newArr3),然后只更改该数组中的值。您需要在每次通话时创建一个新的。

像这样更改您的方法 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) 执行相同的操作。

原因是您覆盖了已经传递的值。像这样:

  • 初始化类,定义数组
  • 首先运行循环,为所有数组中的每个元素分配一个值
  • 第二次运行,为所有数组中的每个元素分配一个值,从而覆盖旧的。

但是你需要做的是:

  • 初始化类,定义外部数组(只有最外面的一个!)
  • 外部循环寻址外部数组并调用内部方法
    • 内部方法创建新数组并用新数据填充它

这样每次调用内部方法时都会有新的数组。

把它想象成一个有房间的房子,每个房间只能放一件东西,如果你穿过一个房子,在每个房间里放一张桌子,然后再穿过同一个房子,把桌子换成凳子;那么最后你会有一个满是凳子的房子。

如果你用桌子填满房子,然后去下一个房子用凳子填满,你会得到两间不同内容的房子。

(在该示例中,房间是您的 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],这只是意味着这两个数组的第 0 个元素是相等的。这是否回答你的问题?或者至少澄清一下?

于 2013-06-20T10:01:50.147 回答