Проблемы с удалением объектов из массива при обработке - PullRequest
3 голосов
/ 25 марта 2020

Я довольно новичок в программировании, и я не могу заставить это работать. Это сложно объяснить. Там в основном генератор частиц, который генерирует заданное количество частиц. Эти частицы должны взаимодействовать друг с другом, поэтому у всех них есть 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();
        }
      }
    }

1 Ответ

2 голосов
/ 25 марта 2020

Вероятно, ваша проблема в том, что массивы и списки массивов в Java копируются поверхностно, когда вы передаете их в метод. По сути, это означает, что когда вы передаете свой 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;
}
...