简短介绍: 我正在构建一个游戏,怪物在顶部产生,并通过一条路径,到达需要移除/销毁/删除的点。但我似乎无法删除怪物对象。
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,并且从未减少。
我正在寻找的是一种在游戏运行时删除这些对象的方法。
答案 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