2013-08-17 100 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 variable也改變了」? – sha1

+0

添加一些可以看到'al'和'ans'更改的sysout。 –

+0

可以更精確地說明'ans'的兩個'println'的輸出是什麼以及你期望的結果是什麼? –

回答

2

你的代碼創建只有兩個使用new關鍵字的ArrayList。一個存儲在ans中,另一個存儲在al中。第二個引用被插入到第一個引用中,但因爲它是相同的對象,所以這些元素是「共享的」。

爲了避免這種共享,您需要爲每個元素創建一個不同的ArrayList。使用new ArrayList<Integer>()創建一個新的ArrayList,而不是清除al,並將其分配給al