在处理中从数组列表中删除对象的问题
Problems with removing objects from an arraylist in processing
我对编程还很陌生,我无法让它工作。
解释起来很复杂。基本上有一个粒子生成器可以生成一定数量的粒子。这些粒子需要相互作用,所以它们都有一个包含所有粒子的 ArrayList。但是,我不希望他们与自己交互,所以我想从他们自己的 ArrayList 中删除对象。存储 class 仍然有他自己的 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);
}
第一个 class 将要存储在 g class
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
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;
}
我对编程还很陌生,我无法让它工作。 解释起来很复杂。基本上有一个粒子生成器可以生成一定数量的粒子。这些粒子需要相互作用,所以它们都有一个包含所有粒子的 ArrayList。但是,我不希望他们与自己交互,所以我想从他们自己的 ArrayList 中删除对象。存储 class 仍然有他自己的 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);
}
第一个 class 将要存储在 g class
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
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;
}