0

这会导致不可预测的行为吗?

 ArrayList<X> x = new ArrayList<>();
 //x.add(new X())...
f:
for(int i = 0; i < x.size() -1;)
{
      X y = x.get(i);
      for(int j = i + 1; j < x.size();)
       {
          if(a) {
           x.remove(j);
           continue;
          }
          if(b) {
           x.remove(i);
           continue f;
          }
          j++;
        }
       i++;
}
4

3 回答 3

1

我不认为这将是不可预测的,但你的风格对我来说似乎是错误的,所以你的方法是可疑的。

使用标签是个坏主意,决定使用它表明你的方法有缺陷。

您可能想查看有关在 ArrayList 上删除的讨论,但基本上,LinkedList 将是 fsster:

http://www.velocityreviews.com/forums/t587893-best-way-to-loop-through-arraylist-and-remove-elements-on-the-way.html

但是,删除这种方式将起作用。

更新:

哎呀,刚刚看到几个错误:

      if(a) {
       x.remove(j);
       continue;
      }

好的,在这一个中,您将返回 j 的循环,但您没有增加 j。

      if(b) {
       x.remove(i);
       continue f;
      }

这对 i 来说也是一样的。

因此,您需要进行类似的更改来修复它:

for(int i = 0; i < x.size() -1; i++)

这样,当您点击时,continue它仍然会转到下一个元素。

于 2012-10-07T02:37:13.013 回答
1

最好创建一个array包含要删除的索引。for并用主循环中的索引填充它。比你可以做这样的事情:

Collections.sort(indexesToRemoveArr);
Collections.reverse(indexesToRemoveArr);
for (int indexToRemove : indexesToRemoveArr) {
     arr.remove((int) indexToRemove );
}

在该代码中,我从头到尾删除索引。这就是为什么它不会有任何问题。

于 2012-10-07T03:27:27.540 回答
0

是的。编译器只会优化和调用 x.size() 一次。因此,一旦删除元素,您的终止条件就会变得不正确。

于 2012-10-07T03:18:36.530 回答