gpt4 book ai didi

java - "Control variable "我 "is modified"

转载 作者:行者123 更新时间:2023-12-01 19:32:06 25 4
gpt4 key购买 nike

这是我的代码,我的问题出在function tube.remove(i--)。这是一个检查样式错误。

for (int i = 0; i < tubes.size(); i++) {
Rectangle rect = tubes.get(i);
rect.x -= spd;

if (rect.x + 40 <= 0) {
tubes.remove(i--);
Hra.getHrac1().setSkore(0.5);
continue;
}
}

最佳答案

在这种情况下,Checkstyle 会警告您这可能是一个错误。但实际上这并不是你的算法中的逻辑错误;而是你的算法中存在逻辑错误。 i--确实减少了 i 的值,但是tubes.remove(i--)也减少tubes.size() ,所以区别tubes.size() - i此操作保持不变。因此循环确实终止。

@deHaar 的建议实际上是不正确,原因有两个。

  • 首先,i - 1i--永远不会有相同的值,因为 i--的值是i的原始值递减之前。如果你这样做tubes.remove(i - 1)那么它不会删除当前列表元素;它将删除当前元素之前的列表元素,该元素不是正确删除的元素。
  • 其次,当您删除索引 i 处的元素时,您要检查的下一个元素将从索引 i + 1 移出到索引i以“填补您删除的元素留下的空白”。如果不递减i ,那么您查看的下一个索引将是 i + 1 ;实际上,您将跳过列表中的下一个元素,因此如果一行中有两个元素需要删除,则循环只会删除一个元素。 i--是必要的,以便您查看索引 i在此之后再次,因为这是删除当前列表元素后下一个列表元素所在的位置。

也就是说,同时 tubes.remove(i--)不是逻辑错误,这肯定是风格错误。两位经验丰富的程序员查看了您的代码并认为它​​是错误的。这意味着您的代码对于经验丰富的程序员来说太棘手,无法阅读它并可靠地弄清楚它的作用,因此应该以更清晰的方式重写它。

以下是重写代码的两种更清晰的方法:

1。向后迭代

如果i从列表末尾到开头,然后 remove方法只会围绕您已经看过的元素进行移动。下一个要查看的索引将是 i - 1是否删除当前元素,因此不需要更新i当你删除一个元素时。

for (int i = tubes.size() - 1; i >= 0; i--) { // iterate backwards
Rectangle rect = tubes.get(i);
rect.x -= spd;

if (rect.x + 40 <= 0) {
tubes.remove(i); // no need to change i here
Hra.getHrac1().setSkore(0.5);
}
}

2。使用 Iterator 删除

从当前正在迭代的列表中删除元素很难做到正确,特别是如果您通过索引删除它们。另一方面,如果您使用 Iterator 显式迭代列表那么你根本不需要使用索引变量,并且迭代器有一个方便的 remove 方法,这不会扰乱列表中后面元素的迭代。

for (Iterator<Rectangle> iter = tubes.iterator(); iter.hasNext();) {
Rectangle rect = iter.next();
rect.x -= spd;

if (rect.x + 40 <= 0) {
iter.remove();
Hra.getHrac1().setSkore(0.5);
}
}

请注意,我已删除 continue来自这两种解决方案,因为无论如何这在循环体结束时都没有影响。

关于java - "Control variable "我 "is modified",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59410820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com