#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();
Это должно сработать.