怪物对象删除

时间:2013-05-13 13:06:41

标签: java object

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

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());时,我会产生越来越多的怪物,并且如果增加怪物产生率,程序开始最终减速,因为Monstre arraylist中的怪物数量超过9000,并且从未减少。 我正在寻找的是一种在游戏运行时删除这些对象的方法。

4 个答案:

答案 0 :(得分:7)

删除i = null;行。这不是 C ,您不必将变量分配给null。 JVM会为你做这件事(google“java垃圾收集”)。由于该行,您几乎会调用Monstre.remove(null),但这不起作用。

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

Iterator<Monster> it= Monstre.iterator(); 
while (it.hasNext()) {
    Monster i= it.next();
    //code code code
    if (shouldDelete) {
        this.remove(i);
        it.remove();
    }
}

答案 1 :(得分:3)

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

而是尝试:

 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 loop

的说明
  

那么什么时候应该使用for-each循环?任何时候你都可以。它真的   美化你的代码。不幸的是,你无法在任何地方使用它。   例如,考虑一下expurgate方法。该计划需要访问   迭代器,以删除当前元素。每个人   循环隐藏迭代器,所以你不能调用删除。因此,   for-each循环不能用于过滤。同样,它不可用   for循环,您需要替换列表或数组中的元素   遍历它。最后,它不适用于必须迭代的循环   多个集合并行。这些缺点是众所周知的   由设计师,谁有意识地决定干净,   简单的构造,涵盖绝大多数情况。

答案 2 :(得分:2)

    i = null; //Sets object too null
    Monstre.remove(i); //Removes object from arrayList "Monstre".

这里你将变量i设置为null然后你请求从你的arraylist中删除i(即null),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)使用迭代器及其删除方法

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

    }
}

答案 3 :(得分:0)

您无法在for-loop中删除此元素。

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