arraylist,删除for循环中的变量

时间:2014-04-09 10:35:58

标签: java for-loop arraylist

我还没有使用ArrayList,并且我认为要从中获取变量,我需要增强的for循环

我试图找出变量并将它们的x值与另一个x和y值比较为另一个y值,如果匹配则删除该变量。

到目前为止,我对此方法的代码是;

public int detect(int x, int y){
    int count=0;
    for (EnemyShip tempEnemy:EList){
        if(x==tempEnemy.x && y==tempEnemy.y){
            EList.remove(tempEnemy);
            count++;
        }
    }
    return count;
}

我知道问题出在EList.remove(tempEnemy);,并知道如果它是正常的循环,如何完成此任务。

但这个增强的循环(我的讲师称之为)让我感到困惑。

所以我想我的问题是如何从Arraylist中删除与x和y匹配的变量?

3 个答案:

答案 0 :(得分:6)

使用Jdk 8,您可以使用removeIf方法安全地删除元素。

  EList.removeIf(e-> x==e.x && y== e.y);

有关removeIf方法的详细信息,请阅读此docs

答案 1 :(得分:2)

当您在列表上进行迭代时(for-each循环在内部创建迭代器)同时您正在更改List的结构,该结构不支持ConcurrentModificationException

使用Iterator<E> api -

for(Iterator iterator = EList.iterator(); iterator.hasNext();) {
    tempEnemy = iterator.next();
    if(x==tempEnemy.x && y==tempEnemy.y){
         iterator.remove();
    }
}

注意:建议使用type-safe List<E>Iterator<E>

答案 2 :(得分:1)

因为坐标上只有一艘船,所以你不需要计数器。

请改用:

01 boolean strike;
02 do {
03     strike = false;
04     for (EnemyShip tempEnemy: EList) {
05         if (x==tempEnemy.x && y==tempEnemy.y) {
06             strike = true;
07             EList.remove(tempEnemy);
08             break; // We need to break here, because the line07 maybe made
09             // the list empty and cause a ConcurrentModificationException.
10             // Also: tempEnemy is not longer part of the list "EList" so we have a invalid state.
11         }
12     } 
13 } while (strike);