Java arraylist,删除for循环中的变量
我没有太多地使用Java arraylist,删除for循环中的变量,java,for-loop,arraylist,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==tempEn
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(temp敌军)如果这是一个正常的for循环,则知道如何完成此任务
但这种增强的for循环(我的讲师称之为for循环)让我感到困惑
因此,我想我的问题是如何从同时匹配x和y的Arraylist中删除变量?当您在列表上迭代时(为每个循环在内部创建迭代器),同时您正在更改列表的结构,该结构不支持并导致ConcurrentModificationException
使用迭代器
api实现该功能-
for(Iterator iterator = EList.iterator(); iterator.hasNext();) {
tempEnemy = iterator.next();
if(x==tempEnemy.x && y==tempEnemy.y){
iterator.remove();
}
}
注意:建议使用类型安全
列表
和迭代器
使用Jdk 8,您可以使用removeIf
方法轻松安全地删除元素
EList.removeIf(e-> x==e.x && y== e.y);
有关removeIf
方法的详细信息,请阅读此内容。因为坐标上只有一艘船,所以不需要计数器
改用这个:
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);
两艘船可以有相同的坐标吗?是的,两艘敌舰可以。如果有两艘船只具有相同的坐标,那么两艘都被摧毁了吗?如果玩家的船与1艘敌舰在同一坐标上,玩家获胜,敌舰被移除,如果玩家与2艘敌舰在同一坐标上,玩家失败。如果有2艘敌舰与玩家飞船在同一坐标上,但不是交易破坏者,那么如果敌舰幸存下来会更好。我认为你的答案还应该解释为什么迭代器
,为什么不。毕竟他是一名学生,OP说他知道如何做到这一点。谢谢大家,我会研究一下。太神奇了,是不是也有故障保护功能?@Subbrajyotimajumder,是的。它永远不会抛出ConcurrentModificationException
。在排序中,它在单个语句中执行迭代器删除+谢谢各位。您可以跳过e->
,改用it
。这样:removeIf(x==it.x&&y==it.y)
。你能证实这一点吗?计数的原因是,如果x和y坐标上只有一艘敌舰,那么程序必须让一艘战舰摧毁另一艘,但如果坐标上有两艘敌舰,那么他们必须获胜。计数是一种方法(我有其他方法,因此如果我不能将其用于解决方案,我可以更改它),以检测在该坐标上该回合有多少艘船被毁,以及是否有多艘船只结束游戏。我已经使用了你的代码,非常感谢。但是:2艘船能赢吗?这条规则非常重要!!!!你需要把它写在问题里。