我正面临着处理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;
}
由于
答案 0 :(得分:2)
您的代码只使用new
关键字创建两个ArrayLists。一个存储在ans
中,另一个存储在al
中。对第二个的引用被插入第一个,但由于它是同一个对象,因此效果是元素是“共享的”。
要避免此共享,您需要为每个元素创建不同的ArrayList。不是清除al
,而是使用new ArrayList<Integer>()
创建一个新的ArrayList,并将其分配给al
。