2015-10-08 59 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