2013-07-28 3 views
2

Я относительно новичок в Java и сталкиваюсь с проблемой. У меня есть 3d ArrayList, и я отправляю элемент этого ArrayList методу, в котором он изменен. Но это, похоже, изменяет другие предметы 3d ArrayList.Модификация субматрицы Java 3D ArrayList изменяет другие подматрицы 3d ArrayList

Поэтому я создаю матрицу ArrayList<ArrayList<ArrayList<Integer>>> и распечатываю каждый элемент.

for(int i =0; i<solutionsMatrix.size(); i++) 
{ 
    //System.out.println(i); 
    System.out.println(solutionsMatrix.get(i)); 
} 

Я затем отправлю этот 3d ArrayList другому методу. Где изменяется каждая подматрица (i). Но при этом каким-то образом модификация матрицы (i) также изменяет другие (не-i) матрицы.

private ArrayList<ArrayList<ArrayList<Integer>>> siftSolutions(ArrayList<ArrayList<ArrayList<Integer>>> solutionsMatrix) 
{ 
    for(int n=0; n<solutionsMatrix.size();n++){ 
    //System.out.println(solutionsMatrix.get(n)); 
    ArrayList<ArrayList<Integer>> currentMatrix = mirrorMatrix(solutionsMatrix.get(n)); 
    System.out.println(currentMatrix); 
} 

Вопрос заключается в том, что распечатано матрица (закомментирована часть во втором блоке коды) не совпадает с распечатанной матрицей первого кодового блока. Я воспользовался кодом и решил, что метод mirrorMatrix каким-то образом изменяет 3d-матрицу solutionsMatrix.

public ArrayList<ArrayList<Integer>> mirrorMatrix(ArrayList<ArrayList<Integer>> unmirrored) { 
    //every value of ij needs to equal ji, thus simply transmit all non-zeros 
    ArrayList<ArrayList<Integer>> mirror = new ArrayList<ArrayList<Integer>>(unmirrored); 
    for (int i = 0; i < mirror.size(); i++) { 
     for (int j = 0; j < mirror.size(); j++) { 
      if (mirror.get(i).get(j) != 0) { 
       mirror.get(j).set(i, mirror.get(i).get(j)); 
      } 
     } 
    } 
    return mirror; 
} 

Я попытался найти ответ в Интернете, но я не мог найти объяснение (которое может быть просто результат, который я не знаю правильную терминологию, чтобы описать мою проблему наилучшим образом). Надеюсь, кто-то может объяснить мне, почему это происходит, поэтому я могу решить проблему и избежать ее в будущем.

ответ

1
ArrayList<ArrayList<Integer>> mirror = new ArrayList<ArrayList<Integer>>(unmirrored); 

Эта строка не делает глубокую копию всех элементов в ней. Он создает новый экземпляр ArrayList, но все его элементы являются одинаковыми экземплярами ArrayList<Integer>, которые присутствовали в экземпляре unmirrored.

Таким образом, изменение этих элементов с помощью mirror.get(j).set(i, mirror.get(i).get(j)); меняет тот же пример mirror.get(j) и unmirrored.get(j). I.e., mirror.get(j) == unmirrored.get(j).

+0

О, я этого не знал. Таким образом, гипотетически, если моя большая 3D-матрица была построена из подматриц, которые были сгенерированы так же, как описано выше. (Я не включал это, но они были сгенерированы рекурсивно пробовали разные комбинации). Модификация одной субматрицы может изменить другую субматрицу в 3d-матрице, потому что они не являются глубокими копиями? – lua

+0

Да, они могли. – drvdijk

Смежные вопросы