Добавить список в 2D arraylist

#java #arraylist #2d

#java #arraylist #2d

Вопрос:

Я остановился на следующей проблеме. Игнорируйте большую часть кода, моя проблема в том, что у меня есть другой список x на каждой итерации, и я хочу проанализировать его в преобразовании 2DarrayList, поэтому я использую conVert.add(x); но моя проблема в x.clear(); . Когда я печатаю conVert перед clear, conVert в порядке, но когда я печатаю его после clear, кроме x, также и conVert очищается. Что я могу для этого сделать? Заранее спасибо

          List<Integer> x =  new ArrayList<Integer>();
       // List<Integer> x1 =  new ArrayList<Integer>();
        List<Integer> valenceList =  new ArrayList<Integer>();
        List<List<Integer>> conVert = new ArrayList<List<Integer>>();


       for (int q = 1; q <= 4; q  ) {


            for (int i = 0; i < Faces.length; i  ) {

                for (int j = 0; j < 2; j  ) {

                    if (Faces[i][j] == q) {

                        x.add(Faces[i][0]);
                        x.add(Faces[i][1]);
                        x.add(Faces[i][2]);

                   }
                }
            }
             removeDuplicateWithOrder((ArrayList) x);
             valenceList.add(x.size() -1);
             //x1 = x;
             conVert.add(x);
             System.out.println(conVert);
             x.clear();
              //System.out.println(conVert);
        }
  

Ответ №1:

Ваше добавление x в conVert будет следовать за любыми изменениями в x , поскольку это просто добавление ссылки в список. Вместо этого вы могли бы скопировать его следующим образом:

 conVert.add(new ArrayList<Integer>(x));
  

В качестве альтернативы вы могли бы просто переместить конструкцию x внутри вашего первого цикла for и пропустить очистку.

Комментарии:

1. Отлично. Вы могли бы сохранить несколько символов с помощью conVert.add(x.clone()); , хотя это означало бы сохранить x типизированный как ArrayList .

2. @Daniel: вам тоже нужно было бы его привести, т. Е. conVert.add((ArrayList) x.clone()); . Я бы сказал, что перемещение конструкции x в первый цикл и удаление clear сэкономило бы большинство символов 🙂

3. Ерунда, вы можете просто сделать l.getClass().getMethod("clone").invoke(l); 🙂

Ответ №2:

Если я вас правильно понимаю, вы видите, что содержимое conVert очищается так же, как и x. Это потому, что list.add не является глубокой копией, он только помещает ссылку на оригинал. Что вы могли бы сделать, так это клонировать x и добавить это —

 List<Integer> tempX = new List<Integer>();
tempX.addAll(x);
conVert.add(tempX);
x.clear();
  

Это должно сработать.