gpt4 book ai didi

java - 在处理中从数组列表中删除对象的问题

转载 作者:行者123 更新时间:2023-12-01 14:27:50 26 4
gpt4 key购买 nike

我对编程还很陌生,我无法让它工作。解释起来很复杂。基本上有一个粒子生成器可以生成一定数量的粒子。这些粒子需要相互作用,所以它们都有一个包含所有粒子的 ArrayList。但是,我不希望他们与自己交互,所以我想从他们自己的 ArrayList 中删除对象。存储类仍然拥有自己的 Arraylist 中的所有对象。问题是当我试图让对象从它们的 Arraylist 中删除一个对象时,所有对象都被删除并且存储对象的 ArrayList 也为空。我知道我不必这样做,但我真的很想知道为什么它不起作用,而且我认为如果它以这种方式工作比每次运行交互函数时都必须跳过一个对象时更干净。因为描述起来比较复杂,还是直接看代码比较好。该代码仅包含重要的代码,并且是简化版本。该行:l.remove(n); , 是搞砸一切的线。

    G g;
void setup()
{size(1000, 600);
g = new G(10);
}
void draw()
{
background(255);
g.displayg();
text(g.g.size(), 200, 200);
}

将要存储在 g 类中的第一个类

class D
{
int n;
ArrayList<D> l = new ArrayList<D>();
D(int input)
{
this.n = input;
}
void seTup(ArrayList<D> input)
{
l = input;
l.remove(n); //if you delete this line, everything works
}
void display()
{
fill(0);
text(this.n, 100+ 10* n, 100);
}
}

和存储类

class G
{ int number;
ArrayList<D> g = new ArrayList<D>();
G(int inputnumber)
{this.number = inputnumber;
for(int i =0; i < number; i++)
{g.add(new D(i));

}
for(int i = g.size()-1; i>=0;i--)
{
D x = g.get(i);
x.seTup(g);
}
}
void displayg()
{
for(D i : g)
{//text(i.n, 100 + 5*i.n, 100);
i.display();
}
}
}

最佳答案

您的问题可能是因为当您将 Java 中的数组和 ArrayList 传递给方法时,它们会被浅层复制。从本质上讲,这意味着当您将 ArrayList 传递给方法时,而不是创建新的 ArrayList,它只是传递当前 ArrayList 的内存位置,因此在方法内部发生的更改也会在方法外部发生。您从其自己的 ArrayList 中删除一个粒子,这会将其从顶级 ArrayList 中删除,并且由于您对每个粒子都执行此操作,因此顶级 ArrayList 将没有粒子。要解决这个问题,您需要制作一个深度复制方法,看起来应该是这样的:

ArrayList<d> deepCopy(ArrayList<d> original)
{
ArrayList<d> copiedList = new ArrayList<d>();
for(int i = 0; i < orginal.size(); i++)
{
copiedList.add(original.get(i);
}
return copiedList;
}

关于java - 在处理中从数组列表中删除对象的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60849097/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com