为什么价值观不一样?

时间:2013-06-20 09:38:21

标签: java arrays

我有以下代码:

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循环中不是这样。 myMethod()是一个使用2D数组初始化arr[idx]的方法。对于我的测试,为了简单起见,我使用了1D数组和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];
}

3 个答案:

答案 0 :(得分:1)

如果myMethod未创建新数组(new int[][]new int[])但重用相同的内存对象,则会将相同的对象放入arr[0]和{{ 1}}。总是被新的价值所填补;最后一个覆盖了之前的那些。

答案 1 :(得分: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(在arrMethod2中)执行相同操作。

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

  • init class,define arrays
  • 首先运行循环,为所有数组中的每个元素赋值
  • 第二次运行,为所有数组中的每个元素赋值,并覆盖旧数组。

但你需要做的是:

  • init class,定义外部数组(只有最外层的数组!)
  • 外部循环地址外部数组并调用内部方法
    • 内部方法创建新数组并使用新数据填充

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

把它想象成一个有房间的房子,每个房间都可以容纳一件事,如果你经过一个房子并在每个房间放一张桌子,然后再次通过相同的房子,用凳子更换桌子;然后最后你将有一个充满凳子的房子。

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

(在那个示例房间是你的arrMethod3,房子是arrMethod2,外面的数组是街道)

答案 2 :(得分:0)

只是为了澄清,如果我从你的描述中正确理解,那么在循环arr[0][0] & arr[1][0]之外是相等的。这意味着即使在循环内部它们也是相等的。但你所说的是不正确的,即arr[0][0] == arr[1][0]并不意味着arr[0] = arr[1],这只是意味着这两个数组的第0个元素是相等的。这是否回答你的问题?还是至少澄清一下?