具有For循环的数组中的Java移位元素

时间:2016-10-19 09:44:48

标签: java arrays for-loop

我知道这个循环会打印{5,1,2,3,4}。 这里的问题是下面的线如何工作?

values[i + 1] = values[i];

根据我的理解,在第一个循环期间,i = 3.因此它将是值[3 + 1] =值[3],这意味着在第4个索引上将有3个元素。这显然是错误,因为输出不同,代码的工作方式不正确。

int[] values = new int[]
        {1, 2, 3, 4, 5};
int temp = values[values.length - 1];
for (int i = values.length - 2; i >= 0; i--)
{
    values[i + 1] = values[i];
}
values[0] = temp;
System.out.println(Arrays.toString(values));

代码将数组的元素向右移动,并将最右边的元素移动到最左边的位置。

请向我解释因为我很困惑。谢谢。

3 个答案:

答案 0 :(得分:1)

他们的关键是观察values在整个循环过程中的变化。由于这不是针对特定语言的,因此让我们在JavaScript中查看它,以便我们可以在现场运行它(我还将values更改为v以缩短消息,以便他们不会t wrap):

var msg;
var v = [1, 2, 3, 4, 5];
var temp = v[v.length - 1];
for (var i = v.length - 2; i >= 0; i--)
{
  msg = "Replacing v[" + i + " + 1] with v[" + i + "]: " + JSON.stringify(v);
  v[i + 1] = v[i];
  msg += " => " + JSON.stringify(v);
  console.log(msg);
}
msg = "Replacing v[0]     with temp: " + JSON.stringify(v);
v[0] = temp;
msg += " => " + JSON.stringify(v);
console.log(msg);

所以

  • 首先,我们将第五个值(5)抓取到temp中,以便日后再使用
  • 然后,在循环中,我们将第五个值(values[i + 1])替换为第四个值(values[i]),将1, 2, 3, 4, 5更改为1, 2, 3, 4, 4
  • 我们再次执行此操作,将第四个替换为第三个,将1, 2, 3, 4, 4更改为1, 2, 3, 3, 4
  • 继续这样做,直到我们用第一个条目替换第二个条目,然后留下1, 1, 2, 3, 4
  • 在循环外部,将temp放在首位,为我们提供最终结果5, 1, 2, 3, 4

答案 1 :(得分:0)

values = [1, 2, 3, 4, 5]

您选择values[4]并将values[3] = 4放在那里,所以现在values[4] = 4。你在这里不明白的是什么?我想你忘记了数组从0而不是1开始编号的事实。

答案 2 :(得分:0)

我认为你忽略了这两个陈述:

int temp = values[values.length - 1];//Here temp = 5, last index element of your array

values[0] = temp;// here 1 will be replaced by 5

由于在循环中最后一个元素丢失,它们将它存储在临时变量temp pre-loop中。循环完成后,将第4个索引替换为3rd,将3rd替换为2nd,将2nd替换为1st,将第1个替换为第0个索引元素。

循环完成后,您的数组看起来像这样:

  

[1,1,2,3,4]

现在第0个索引元素被temp替换,temp是数组的原始第4个索引。

  

现在数组将是[5,1,2,3,4]

现在有道理吗?

P.S:我建议你通过在两者之间加入更多的println语句进行调试,以检查发生了什么。 我的建议是在您的代码中进行以下操作以便更好地理解:

System.out.println(Arrays.toString(values));
values[0] = temp;
System.out.println(Arrays.toString(values));