【问题标题】:arraylist, delete a variable in a for looparraylist,在for循环中删除一个变量
【发布时间】:2014-04-09 10:35:57
【问题描述】:

我没有经常使用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); 上,并且如果它是正常的 for 循环,我知道如何完成此任务。

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

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

【问题讨论】:

  • 两艘船可以有相同的坐标吗?
  • 是的,两艘敌舰可以。
  • 如果有两艘坐标相同的船,都被摧毁了吗?
  • 如果玩家战舰与 1 艘敌舰在同一坐标上,则玩家获胜并移除敌舰,如果玩家与 2 艘敌舰在同一坐标上,则玩家输。如果有 2 艘敌舰在与玩家舰船相同的坐标上,敌舰幸存会更好,但不会破坏交易。

标签: java for-loop arraylist


【解决方案1】:

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

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

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

【讨论】:

  • 太神奇了,是不是也是fail-safe
  • @SubhrajyotiMajumder,是的。它永远不会抛出ConcurrentModificationException
  • 在排序中,它在单个语句中执行迭代器删除。 +1
  • 谢谢大家。现在就试试这个。
  • afaik 你可以跳过e-> 并改用it。像这样:removeIf(x == it.x && y == it.y)。你能确认一下吗?
【解决方案2】:

当您迭代列表时(for-each 循环在内部创建迭代器)同时您正在更改不支持并导致 ConcurrentModificationExceptionList 的结构。

为此使用Iterator<E> api -

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

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

【讨论】:

  • 我认为您的回答还应该解释为什么 Iterator 和为什么不 for each 循环。毕竟他是一名学生,OP 说他知道如何完成它。
  • 谢谢大家,我会调查的。
【解决方案3】:

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

改用这个:

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);

【讨论】:

  • 计数的原因是如果 x 和 y 上只有一艘敌舰,但如果在这些坐标上有两艘敌舰,则程序必须让一艘船摧毁另一艘.计数是一种方法(我有其他方法,所以如果我不能将它与解决方案一起使用,我可以更改它)来检测在那个回合中有多少艘船在该坐标处被摧毁,以及是否超过一艘来结束游戏。我已经使用了你的代码,它已经成功了,非常感谢。
  • 但是:2艘能赢?这条规则很重要!!!!您需要将其写在问题中。
猜你喜欢
  • 2021-07-04
  • 2016-07-19
  • 2021-05-21
  • 2012-05-31
  • 2013-05-20
  • 2017-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多