【问题标题】:Understanding arrays and value assignments理解数组和赋值
【发布时间】:2014-02-11 04:44:12
【问题描述】:

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

 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} 作为输出。

【问题讨论】:

  • 请发给你其他方法。在reverseArray2() 中,您将第一个与最后一个交换,第二个与最后一个交换,依此类推。

标签: java arrays methods


【解决方案1】:

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

i &lt; length / 2 条件确保 i 只到达数组的中间(这是整数除法,所以奇数无关紧要(例如:5/2 == 2))

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

【讨论】:

  • 好吧,我想我终于明白它是如何工作的了。我以为我们遍历了整个数组,但我们只做了一半(中间值几乎没有改变)。但是,当您分配一个数组相等性然后您更改一个数组中的值(从而影响另一个数组)时,这些情况下数组的值受到影响?
  • x = y 不是相等,而是赋值。它的意思是“将 y 的值复制到 x 中”。平等是x == y
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    这也意味着你不能这样写:

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

    因为如果您不将array[i] 的值保存到其他变量,例如temp,它将破坏它。 所以先保存到temp:int temp = array[i]。然后把array[j]的值放到array[i]array[i] = array[j]。最后把array[i] 放到array[j] by 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 &lt; array.length / 2 条件失败。所以循环退出。

    现在您有了反向列表:{ 5, 4, 3, 2, 1}

    【讨论】:

      【解决方案4】:

      举个例子

      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 将由第二个元素初始化并用于交换第二个和倒数第二个元素。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-12
        • 1970-01-01
        • 2019-10-23
        • 2014-02-24
        • 1970-01-01
        • 2021-11-23
        • 2020-07-26
        相关资源
        最近更新 更多