我还没有使用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匹配的变量?
答案 0 :(得分:6)
答案 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);