2015-10-08 63 views
1

好吧,在我的课程项目中,我正在通过一个带有增强for循环的我的类“Sprite”的ArrayList,并且偶尔需要删除我正在查看的Sprite。我被告知我可以安全地做到这一点(即不删除我目前正在看的精灵)与迭代器。我看着它在Oracle的Java文档,但我真的不明白它..在Java中使用增强for循环的迭代器?

这里是我的方法:

public void forward() { 
    for (Sprite s : sprites) { 
     s.move(); 
     for(Sprite x : sprites){ 
      if(s!=x && s.overlaps(x)){     
       if(s instanceof Razorback && x instanceof Opponent){ 
        x.hit(); 
       } 
       if(x instanceof Razorback && s instanceof Opponent){ 
        s.hit(); 
       } 
      } 

     } 
     if(s.shouldRemove()) 
      sprites.remove(s); 

    } 

} 

如果(s.shouldRemove())是我需要实现一个迭代器。如果shouldRemove()返回true,则需要从ArrayList中删除s。

+1

很确定你不能,因为你需要调用Iterators'' remove'方法 – MadProgrammer

+0

你需要更老的for循环来安全地移除物品。 Outter for循环必须从最大长度开始,比如'for(int i = sprites.size(); i> = 0; i - )'。否则,它可能是'ConcurrentModificationException'的原因。内循环是好的。 –

回答

4

您需要使用迭代器本身循环(和删除)。

for (Sprite s : sprites) { 

应改为,

Iterator<Sprite> it = sprites.iterator(); 
while (it.hasNext()) { 
    Sprite s = it.next(); 

然后你if条件将是,

if (s.shouldRemove()) 
    it.remove(); 
+0

你应该使用'Iterator '。 –

+1

@PaulBoddington,谢谢...修复它... – Codebender

+0

好的,谢谢!似乎是完美的工作,但如何增加?我看到s = it.next,但不是这样,每次都是一样的。或者是否.hasNext自动增加它或什么? – user3304654

2

除了@Codebender答案:限制迭代变量的范围,您可以使用普通的for回路:

for(Iterator<Sprite> it = sprites.iterator(); it.hasNext();) { 
    Sprite s = it.next(); 

    ... 
    if (s.shouldRemove()) 
     it.remove(); 
} 

这样it变量在循环后是未定义的。

+0

好的除了谢谢! – user3304654