-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キーワードを使用して 2 つの ArrayLists のみを作成します。1 つは に保存されans、もう 1 つは に保存されalます。2 番目のものへの参照は最初のものに挿入されますが、同じオブジェクトであるため、要素が「共有」されるという効果があります。

この共有を避けるには、要素ごとに異なる ArrayList を作成する必要があります。をクリアする代わりにal、 を使用して新しい ArrayList を作成し、new ArrayList<Integer>()それを に割り当てalます。

于 2013-08-17T23:21:25.140 に答える