1

簡単な紹介: 私は、モンスターが一番上に出現し、パスを移動して、それらを削除/破壊/削除する必要があるポイントに到達するゲームを構築しています。しかし、Monster 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 配列リストのモンスターの量が 9000 を超え、決して減少しないため、プログラムは最終的に遅くなり始めます。私が探しているのは、ゲームの実行中にこれらのオブジェクトを削除する方法です。

4

4 に答える 4

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();
    }
}
于 2013-05-13T13:09:42.173 に答える
2
    i = null; //Sets object too null
    Monstre.remove(i); //Removes object from arrayList "Monstre".

ここで、変数 i を null に設定してから、配列リストから i (つまり null) を削除するように要求します。配列リストには null が含まれていないため、何も起こりません。null に等しいものを設定する必要があることはほとんどありません。

あなたが正しく言ったように、 i=null を削除するとプログラムが混乱します。これは、リストを反復し、反復中にリストを変更しているためです。2つのオプションがあります。

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

でこの要素を削除することはできませんfor-loop

listIterator()メソッドを使用して、変更可能なイテレータを取得し、イテレータ スタイルでループする必要があります。そうしないと、常に java.util.ConcurrentModificationException が発生します。

于 2013-05-13T13:14:04.970 に答える