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循环不可用于筛选。类似地,它也不可用
用于需要的循环