【问题标题】:Java Shifting Elements in an Array with a For-loopJava 使用 For 循环移动数组中的元素
【发布时间】:2017-02-28 21:04:47
【问题描述】:

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

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

据我了解,在第一个循环期间,i = 3。所以这将是 values[3+1] = values[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));

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

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

【问题讨论】:

  • 理解这一点的最好方法是在调试器中逐个语句地逐句执行它,同时观察数组中包含的内容。
  • 我有,但我还是不明白。
  • 这没什么花哨的,如果您想了解更多,只需在每次迭代后循环打印数组内容即可。

标签: java arrays for-loop


【解决方案1】:

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

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

【讨论】:

  • 谢谢!您的深入步骤清晰准确!这对我帮助很大。
【解决方案2】:

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

你把values[4] 放在那里,然后把values[3] = 4 放在那里,所以现在是values[4] = 4。这里有什么不明白的?我想你忘记了数组的编号是从 0 而不是 1 开始的。

【讨论】:

    【解决方案3】:

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

    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 预循环中。一旦循环完成,即第 4 个索引被第 3 个替换,第 3 个被第 2 个替换,第 2 个被第 1 个替换,第 1 个被第 0 个索引元素替换。

    循环完成后,您的数组将如下所示:

    [1,1,2,3,4]

    现在第 0 个索引元素被替换为 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));
    

    【讨论】:

    • 我不确定谁投了反对票,但我确实理解了这两个语句,我只是不明白循环中的语句是如何工作的。但无论如何感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    相关资源
    最近更新 更多