2012-12-12 129 views
2

我有我的班'炸彈'Java中的ArrayList。Java刪除arraylist迭代器

該類有一個isExploded方法,如果炸彈爆炸了,這個方法將返回true,否則返回false。

現在我試圖遍歷這個ArrayList,調用這個方法isExploded並從列表中移除元素,如果它返回true。

我知道如何遍歷:

for (Iterator i = bombGrid.listIterator(); i.hasNext();) { 
    if() {   
     i.remove(); 
} 

但我不知道如何通過迭代器訪問炸彈類本身的方法isExploded。有誰知道這個答案嗎?

真誠,

盧克索

回答

5

你需要使用next拿到炸彈:(?是它的一個ArrayList<Bomb>

for (Iterator i = bombGrid.listIterator(); i.hasNext();) { 
    Bomb bomb = (Bomb) i.next(); 
    if (bomb.isExploded()) i.remove(); 
} 

或者,如果你可以從你的bombGrid得到Iterator<Bomb>

Iterator<Bomb> i = bombGrid.listIterator(); 
while (i.hasNext()) { 
    Bomb bomb = i.next(); 
    if (bomb.isExploded()) i.remove(); 
} 

這假設y我們的迭代器支持remove,例如ArrayList給出的情況。

0

如果你使用Java 5,使用泛型:

List<Bomb> bombGrid = ...; 
for (Iterator<Bomb> i = bombGrid.iterator(); i.hasNext();) { 
    if (i.next().isExploded()) {   
    i.remove(); 
    } 
} 
-2

不,你不能一個Iterator的內部,而它迭代移除的ArrayList。這裏的Javadoc提取物:

是快速失敗此類的iterator和listIterator方法返回的迭代器:如果列表在任何時間從結構上修改創建迭代器之後,以任何方式,除了通過迭代器自身的remove或添加方法,迭代器將拋出ConcurrentModificationException。因此,面對併發修改,迭代器快速而乾淨地失敗,而不是在將來某個未確定的時間冒着任意的,非確定性的行爲風險。使用迭代**

http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html

+3

如果列表被修改**,它的罰款。 –

+0

看看[Itr類]的實現(http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/ArrayList.java#ArrayList。迭代器%28%29):它處理刪除當前元素的情況。 –

+0

對不起,但即使它工作,我仍然認爲它不是一個好的做法,因爲它是在javadoc中聲明的:請注意,迭代器的故障快速行爲無法得到保證,因爲通常來說,不可能做出任何硬性保證存在未同步的併發修改。失敗快速迭代器盡最大努力拋出ConcurrentModificationException。因此,編寫一個依賴於此異常的程序是正確的:迭代器的快速失敗行爲應僅用於檢測錯誤。 而且我也看到了潛在的內存泄漏 – user1898956