-1

我在处理 Arraylist 的 Arraylist 时遇到问题。每当我清除代码中的 Arraylist al 时,ans 变量也会发生变化。我知道它是通过引用存储的。知道如何解决这个问题吗?我的代码如下:

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;        
} 

谢谢

4

1 回答 1

2

new您的代码使用关键字仅创建两个 ArrayList 。一个存储在ans,另一个存储在al. 对第二个的引用被插入到第一个中,但由于它是同一个对象,所以效果是元素是“共享的”。

为避免这种共享,您需要为每个元素创建不同的 ArrayList。而不是清除al,使用创建一个新的 ArrayListnew ArrayList<Integer>()并将其分配给al.

于 2013-08-17T23:21:25.140 回答