2013-08-17 3 views
-1

Я столкнулся с проблемой, связанной с Arraylist Arraylist. Всякий раз, когда я очищаю Arraylist al в моем коде, переменная ans также изменяется. Я знаю, что он хранится по ссылке. Любая идея, как решить эту проблему? Мой код приведен ниже:Сохраняет ли ArrayList ArrayList ссылку?

public ArrayList<ArrayList<Integer>> levelOrder(TreeNode root) { 
    ArrayList<ArrayList<Integer>> ans = new ArrayList(); 
    ArrayList<Integer> al = new ArrayList(); 
    Queue<TreeNode> myQ = new LinkedList(); 
    if(root == null) 
     return ans; 
    myQ.add(root); 
    myQ.add(null); 
    TreeNode temp; 
    while(!myQ.isEmpty()){ 
     temp = myQ.remove(); 
     if(temp == null){ 
      ans.add(al); 
      System.out.println("al is: " + al); 
      System.out.println(" ans is: " + ans); 
      al.clear(); 
      System.out.println("   ans is: " + ans); 
      if(myQ.isEmpty()) 
       break; 
      myQ.add(null); 
     } 
     else{ 
      al.add(temp.val); 
      if(temp.left != null) 
       myQ.add(temp.left); 
      if(temp.right != null) 
       myQ.add(temp.right); 
     } 
    } 
    //System.out.println(ans); 
    return ans;   
} 

Благодарности

+2

Что вы подразумеваете под «переменной ans, также измененной»? – sha1

+0

Добавьте некоторые из sysout, где можно увидеть изменения 'al' и' ans'. –

+0

Не могли бы вы уточнить, что означает вывод двух 'println'' ans' и чего вы ожидаете? –

ответ

2

Ваш код создает только два ArrayLists используя new ключевое слово. Один хранится в ans, а другой хранится в al. Ссылки на вторую вставляются в первый, но поскольку это тот же самый объект, эффект заключается в том, что элементы «разделены».

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