【问题标题】:Iterating two ArrayLists like in a 2-dimensional Array像在二维数组中一样迭代两个 ArrayList
【发布时间】:2016-04-15 12:56:07
【问题描述】:

我正在尝试迭代两个 ArrayList:其中一个叫做“gegner”是关于敌人的列表,另一个叫做“waende”是关于墙壁的。

每当一堵墙和一个敌人接触时,两者都应该失去一个耐久度/生命值。 由于它不能同时工作,我创建了一个新方法,应该从列表中删除死亡对象。

我的想法是:

public void removeDeathObjects() {
    Wand tempW;
    Gegner tempG;
    for (Iterator<Gegner> it = gegner.iterator(); it.hasNext();) {
        tempG = it.next();
        for (Iterator<Wand> it2 = waende.iterator(); it2.hasNext();) {
            tempW = it2.next();

                if(tempW.isDestroyed()){
                    it2.remove();
                }
                if (tempG.isDeath()){
                    it.remove();
                }
        }   

    }
}

但是只要至少有两堵墙,程序就会在it.remove()java.lang.IllegalStateException 行中抛出“线程“AWT-EventQueue-0”中的异常,并且敌人没有被完全杀死。

我在哪里失败了?

如果你愿意,我可以给你完整的代码,但它很长._.

PS: 抱歉英语不好

【问题讨论】:

  • 我不明白为什么你的两个循环是嵌套的。你不只是想要gegner.removeIf(g -&gt; g.isDeath())之类的东西吗?

标签: java arraylist multidimensional-array iterator


【解决方案1】:

你的答案在这里:http://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html#remove--

IllegalStateException - 如果下一个方法还没有被调用,或者在最后一次调用下一个方法之后已经调用了 remove 方法

您可以在 Java 8 中执行此操作,而不是手动迭代:

public void removeDeathObjects() {
    gegner.removeIf(g -> g.isDeath());
    waende.removeIf(w -> w.isDestroyed());
}

【讨论】:

    【解决方案2】:

    你的错误是你嵌套了两个完全独立的循环。查看您的代码,很明显waende 上的内部循环与gegner 上的外部循环无关:您对waende 的操作不依赖于对gegner 的任何检查。发生的情况是当tempG.isDeath() 为真时,it.remove() 重复执行,对于waende 中的每个Wand。迭代器上的第一次删除成功,但第二次失败。

    你需要做的是将两个循环分开:

    public void removeDeathObjects() {
        Wand tempW;
        Gegner tempG;
        for (Iterator<Gegner> it = gegner.iterator(); it.hasNext();) {
            tempG = it.next();
            if (tempG.isDeath()){
                it.remove();
            }
        }
        for (Iterator<Wand> it2 = waende.iterator(); it2.hasNext();) {
            tempW = it2.next();
            if(tempW.isDestroyed()){
                it2.remove();
            }
        }   
    }
    

    【讨论】:

    • 您已经交换了两个 if 块。 ;-) 解决这个问题,你有我的赞成票。还不如直接把tempG = it.next()tempW = it2.next()放到for循环里面。
    • @JulienLopez 呸!感谢您指出我的错误!至于 for 循环的更改,我喜欢尽可能少地触摸问题的代码,如果只是为了更清楚我想说的话。
    猜你喜欢
    • 2015-08-13
    • 1970-01-01
    • 2012-11-06
    • 2022-11-27
    • 2014-03-26
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 2013-09-13
    相关资源
    最近更新 更多