1

简短介绍:我正在构建一个游戏,怪物在顶部生成,并通过一条路径移动,到达需要移除/摧毁/删除的点。但我似乎无法删除怪物对象。

for (Monster i : Monstre) 
    {
        this.add(i); //adds monster to JPanel

if(i.monstery > 50 && i.monsterx > 50){  //check if monster have reached end point

        this.remove(i); //Should remove Object from the JPanel ?
        i = null; //Sets object too null
        Monstre.remove(i); //Removes object from arrayList "Monstre".

}else{
//Update the monsters bounds

以上从JPanel中删除了对象,看起来一切都很好。但是当我打电话时,System.out.println(Monstre.size());我得到了越来越多的怪物产生,如果增加怪物产生率,程序最终开始变慢,因为怪物数组列表中的怪物数量超过 9000,并且永远不会减少。我正在寻找的是一种在游戏运行时删除这些对象的方法。

4

4 回答 4

7

删除i = null;线。这不是C,您不必将变量分配给null. JVM 会为你做这件事(谷歌“java 垃圾收集”)。由于那条线,您实际上调用Monstre.remove(null)which 不起作用。

此外,您不能以这种方式遍历集合并对其进行修改(删除值)。将要删除的怪物保存在循环范围之外的数组中,并在循环结束后将其删除。否则,使用迭代器:

Iterator<Monster> it= Monstre.iterator(); 
while (it.hasNext()) {
    Monster i= it.next();
    //code code code
    if (shouldDelete) {
        this.remove(i);
        it.remove();
    }
}
于 2013-05-13T13:09:42.173 回答
3

除了第一个答案中的建议外,您还应该更改循环。Monstre在使用 for-each 循环时从列表中删除项目会导致问题。

而是尝试:

 Iterator<Monster> iter = Monstre.iterator ();
 while (iter.hasNext()) 
    {
        i = iter.next();
        this.add(i); //adds monster to JPanel

        if(i.monstery > 50 && i.monsterx > 50){  //check if monster have reached end point

            this.remove(i);
            iter.remove();

        }else{

编辑 :

这是您不能使用for-each 循环的解释:

那么什么时候应该使用 for-each 循环呢?任何时候都可以。它确实美化了您的代码。不幸的是,您不能在任何地方使用它。例如,考虑一下 expurgate 方法。程序需要访问迭代器才能删除当前元素。for-each 循环隐藏了迭代器,因此您不能调用 remove。因此,for-each 循环不可用于过滤。同样,它不适用于在遍历时需要替换列表或数组中的元素的循环。最后,它不适用于必须并行迭代多个集合的循环。设计师们知道这些缺点,他们有意识地决定采用一个干净、简单的结构,可以覆盖绝大多数情况。

于 2013-05-13T13:15:25.073 回答
2
    i = null; //Sets object too null
    Monstre.remove(i); //Removes object from arrayList "Monstre".

在这里,您将变量 i 设置为 null,然后您请求将 i(即 null)从您的 arraylist 中删除,arraylist 不包含 null,因此没有任何反应。将事物设置为 null 很少有必要。

正如您所说的那样,删除 i=null 会扰乱程序,这是因为您正在迭代列表,然后在迭代时更改列表,您有两个选择;

1)在类似于数组的庄园中遍历Arraylist

import java.util.*;

public class Test{

    public static void main(String [] args){
        ArrayList<Double> doubles=new  ArrayList<Double>();

        for(double i=0;i<10;i++){
            doubles.add(i);
        }

        //remove 7.0s from doubles

        for(int i=doubles.size()-1;i>=0;i--){
            //must go through backwards - see http://stackoverflow.com/questions/12111210/java-arraylist-search-and-remove for why

            if (doubles.get(i).equals(7.0)){
                doubles.remove(i);
            }
        }

    }
}

2)使用迭代器及其remove方法

import java.util.*;

public class Test{

    public static void main(String [] args){
        ArrayList<Double> doubles=new  ArrayList<Double>();

        for(double i=0;i<10;i++){
            doubles.add(i);
        }

        //remove 7.0s from doubles

        Iterator<Double> iterator=doubles.iterator();

        while(iterator.hasNext()){
            Double testDouble=iterator.next();
            if (testDouble.equals(7.0)){
                iterator.remove();
            }
        }

    }
}
于 2013-05-13T13:12:34.370 回答
0

您不能在 a 中删除此元素for-loop

您需要使用listIterator()方法来检索可以修改的迭代器并以迭代器样式循环。否则你总是会得到 java.util.ConcurrentModificationException

于 2013-05-13T13:14:04.970 回答