2013-08-10 5 views
0

Я работал над большим проектом и столкнулся с проблемой, которую я воспроизвел здесь гораздо проще. То, что я пытаюсь сделать, - добавить ArrayList из целых чисел в другой ArrayList. Проблема в том, что каждый массив ArrayList, который я добавляю в массив ArrayList, обновляется, как если бы они были одинаковыми.ArrayList of ArrayLists in Recursion

public class RecursionTest { 
static ArrayList<Integer> test = new ArrayList<Integer>(); 
static ArrayList<ArrayList<Integer>> test1 = new ArrayList<ArrayList<Integer>>(); 

public static void testRecurse(int n) { 
    test.add(n); 
    if (n % 2 == 0) { 
     test1.add(test); 
    } 
    if (n == 0) { 
     for (ArrayList<Integer> a : test1) { 
      for (Integer i : a) { 
       System.out.print(i + " "); 
      } 
      System.out.println(); 
     } 
     return; 
    }  
    testRecurse(n - 1);  
} 

public static void main(String[] args) {   
    testRecurse(10); 
} 
} 

Выход я получаю:

10 9 8 7 6 5 4 3 2 1 0 
10 9 8 7 6 5 4 3 2 1 0 
10 9 8 7 6 5 4 3 2 1 0 
10 9 8 7 6 5 4 3 2 1 0 
10 9 8 7 6 5 4 3 2 1 0 
10 9 8 7 6 5 4 3 2 1 0 

Когда он должен быть:

10 
10 9 8 
10 9 8 7 6 
10 9 8 7 6 5 4 
10 9 8 7 6 5 4 3 2 
10 9 8 7 6 5 4 3 2 1 0 

Может кто-нибудь объяснить мне, что здесь происходит? И, возможно, предложите работу для такой ситуации.

ответ

1

Вы снова добавляете точный объект test в ArrayList снова и снова. Вот почему все они меняются вместе.

Каждый раз, когда вы хотите его добавить, вам необходимо создать new ArrayList<Integer>(), прежде чем добавлять его.

Вы можете попробовать заменить

test1.add(test); 

с

test = new ArrayList<Integer>(test); 
test1.add(test); 

Это делает копию текущего теста, а затем добавляет его в список.

Это все равно означает, что элементы Integer, содержащиеся в ArrayList, будут иметь такую ​​же ошибку, поскольку это мелкая копия, но поскольку вы не изменяете их, это нормально для этого случая.

+0

Хорошо, это имеет смысл. Я не мог окутать голову, почему обновление внутри test1 обновлялось, и предположил, что копия была сделана автоматически. Я немного изменил ваше решение: ArrayList temp = new ArrayList (тест); test1.add (temp); И, похоже, выводят правильные цифры. Спасибо за помощь! –

+0

@DustinLiang Рад помочь. –

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