了解数组和值分配

时间:2014-02-11 04:44:12

标签: java arrays methods

我真的不明白数组中的值赋值是如何工作的。我正在浏览这段代码(一种用于反转数组值的方法):

 public static int[] reverseArray2(int[] array) 
  {
    int i = 0, j = array.length - 1;
    for (i = 0; i < array.length / 2; i++, j--) 
    {
      int temp = array[i];
      array[i] = array[j];
      array[j] = temp;
    }
    return array;
  }

为什么在这种情况下数组现在已正确交换? (对于由元素{1,2,3,4,5}组成的数组,我们想要交换它)。第array[i] = array[j]行以哪种方式帮助实现这一目标?同样,我怎么知道分配给数组的值是? (或者,他们被覆盖的方式)。我尝试使用另一种方法,但我得到{5,4,3,4,5}作为输出。

4 个答案:

答案 0 :(得分:1)

基本上在该循环中,索引i从0开始,每次迭代递增1,而j从最后一个数组元素开始,每次迭代递减1。

i < length / 2条件确保我只能到数组的中间位置(这是整数除法,所以奇数无关紧要(例如:5/2 == 2))

int temp = array[i];将索引i处的数组值保存在临时变量中,array[i] = array[j]使用j处的值覆盖i处的值。最后array[j] = temp恢复临时变量并将其放在j。

答案 1 :(得分:0)

在内存中交换两个值总是需要第三个(在这种情况下为temp)。您将其中一个单元格的当前值设置为(temp = ...),然后覆盖该单元格中存储的内容(a [i] = a [j]),最后将原始单元格值放入其新单元格中斑点(a [j] = a [i])。

这里的for循环只是到达数组的中间点,从0增加一个计数器,从array.length-1递减另一个

答案 2 :(得分:0)

让我们举个例子

array={1,2,3,4,5}

现在我们首先进入循环 我们有

i=0,J=4

现在,我们有三行

1。)temp =a[i] = a[0] = 1; 所以现在将一个存储到变量temp下的不同内存位置。

同样,

2。)a[i] = a[j] =a[4] =5;

此处5分配给存储位置,其中先前存储了1并且该位置位于a[0]下。即现在阵列的Ist元素已成为5

现在,

3。)a[j]=temp=1;

所以现在位置a[4]的数组的最后一个元素变为等于1,这是之前的第一个元素。

最后在下一个循环中,temp将由第二个元素初始化,并用于交换第二个和第二个元素。

注意:我想现在很明显为什么我们将循环运行到实际大小的数组的一半。

答案 3 :(得分:0)

array[i] = array[j]从右到左执行。这意味着array[j]的值将被放入array[i]

这也意味着你不能用以下方式写作:

array[i] = array[j]
array[j] = array[i]

因为如果你不将它保存到其他变量,它会破坏array[i]的值,比如说temp。 首先将其保存到tempint temp = array[i]。然后将array[j]的值设为array[i]array[i] = array[j]。最后通过array[i]array[j]放到array[j] = temp

如果上述概念清楚,那么我们可以通过以下方式模拟循环:

说,列表是{1,2,3,4,5}

  • i = 0,然后j = 4

    1 2 3 4 5
    ^       ^
    i       j
    

    现在循环中的代码将交换值,数组将如下所示:

    5 2 3 4 1
    ^       ^
    i       j
    
  • i = 1,然后j = 3

    1 2 3 4 5
      ^   ^
      i   j
    

    现在循环中的代码将交换值,数组将如下所示:

    5 4 3 2 1
      ^   ^
      i   j
    
  • i = 2,i < array.length / 2条件失败。所以循环退出。

现在你有了相反的清单:{ 5, 4, 3, 2, 1}