Java 怪物对象删除

Java 怪物对象删除,java,object,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 th

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

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个,而且从不减少。

我正在寻找的是一种在游戏运行时移除这些对象的方法。

移除
I=null行。这不是C,您不必将变量分配给
null
。JVM将为您做这件事(谷歌“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();
    }
}
Iterator it=Monstre.Iterator();
while(it.hasNext()){
怪物i=它。下一个();
//代码
如果(应删除){
本条。删除(i);
it.remove();
}
}

删除
i=null行。这不是C,您不必将变量分配给
null
。JVM将为您做这件事(谷歌“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();
    }
}
Iterator it=Monstre.Iterator();
while(it.hasNext()){
怪物i=它。下一个();
//代码
如果(应删除){
本条。删除(i);
it.remove();
}
}
在这里,您将变量i设置为null,然后请求从arraylist中删除i(即null),arraylist不包含null,因此不会发生任何事情。将事物设置为null很少是必要的

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

1) 在类似于阵列的庄园中遍历阵列列表

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

    }
}
import java.util.*;
公开课考试{
公共静态void main(字符串[]args){
ArrayList doubles=新的ArrayList();
对于(双i=0;i=0;i--){
//必须向后走-参见http://stackoverflow.com/questions/12111210/java-arraylist-search-and-remove 为什么
如果(双倍get(i)等于(7.0)){
双倍。移除(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();
            }
        }

    }
}
import java.util.*;
公开课考试{
公共静态void main(字符串[]args){
ArrayList doubles=新的ArrayList();
对于(双i=0;i
在这里,您将变量i设置为null,然后请求从arraylist中删除i(即null),arraylist不包含null,因此不会发生任何事情。将值设置为null是非常必要的

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

1) 在类似于阵列的庄园中遍历阵列列表

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

    }
}
import java.util.*;
公开课考试{
公共静态void main(字符串[]args){
ArrayList doubles=新的ArrayList();
对于(双i=0;i=0;i--){
//必须向后走-参见http://stackoverflow.com/questions/12111210/java-arraylist-search-and-remove 为什么
如果(双倍get(i)等于(7.0)){
双倍。移除(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();
            }
        }

    }
}
import java.util.*;
公开课考试{
公共静态void main(字符串[]args){
ArrayList doubles=新的ArrayList();

对于(双i=0;i您不能在
for循环中删除此元素


您需要使用
listIterator()
方法检索可以修改的迭代器,并使用迭代器样式进行循环。否则,您将始终获得java.util.ConcurrentModificationException

您无法在
for循环中删除此元素


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

除了第一个答案中的建议之外,您还应该更改循环。在使用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{
Iterator iter=Monstre.Iterator();
while(iter.hasNext())
{
i=iter.next();
this.add(i);//将怪物添加到JPanel
如果(i.monstery>50&&i.monsterx>50){//检查怪物是否已到达终点
本条。删除(i);
iter.remove();
}否则{
编辑:

以下是您不能使用的说明:

那么你应该什么时候使用for-each循环呢?任何时候都可以。真的吗 美化你的代码。不幸的是,你不能在任何地方都使用它。 例如,考虑ExpDurt方法。程序需要访问。 到迭代器,以便删除当前元素 循环隐藏迭代器,因此不能调用remove for each循环不可用于筛选。类似地,它也不可用 用于需要的循环