Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java arraylist,删除for循环中的变量_Java_For Loop_Arraylist - Fatal编程技术网

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循环)让我感到困惑


因此,我想我的问题是如何从同时匹配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艘船能赢吗?这条规则非常重要!!!!你需要把它写在问题里。