Java 为什么要将ArrayList分配给新的ArrayList temp
我正在看leetcode上排列问题的代码。例如 [1,2,3]具有以下排列: [1,2,3]、[1,3,2]、[2,1,3]、[2,3,1]、[3,1,2]和[3,2,1]。 我发现有一句话Java 为什么要将ArrayList分配给新的ArrayList temp,java,arraylist,Java,Arraylist,我正在看leetcode上排列问题的代码。例如 [1,2,3]具有以下排列: [1,2,3]、[1,3,2]、[2,1,3]、[2,3,1]、[3,1,2]和[3,2,1]。 我发现有一句话 ArrayList<Integer> temp = new ArrayList<Integer>(l); ArrayList temp=新的ArrayList(l); 我不知道为什么这里需要将“l”指定给“temp”。我试着用current.add(l)direclty,但给出了
ArrayList<Integer> temp = new ArrayList<Integer>(l);
ArrayList temp=新的ArrayList(l);
我不知道为什么这里需要将“l”指定给“temp”。我试着用current.add(l)direclty,但给出了错误的答案。你能帮我吗
public class Solution {
public ArrayList<ArrayList<Integer>> permute(int[] num) {
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
//start from an empty list
result.add(new ArrayList<Integer>());
for (int i = 0; i < num.length; i++) {
//list of list in current iteration of the array num
ArrayList<ArrayList<Integer>> current = new ArrayList<ArrayList<Integer>>();
for (ArrayList<Integer> l : result) {
// # of locations to insert is largest index + 1
for (int j = 0; j < l.size()+1; j++) {
// + add num[i] to different locations
l.add(j, num[i]);
ArrayList<Integer> temp = new ArrayList<Integer>(l);
current.add(temp);
//System.out.println(temp);
// - remove num[i] add
l.remove(j);
}
}
result = new ArrayList<ArrayList<Integer>>(current);
}
return result;
}
}
公共类解决方案{
公共数组列表排列(int[]num){
ArrayList结果=新建ArrayList();
//从空列表开始
添加(新的ArrayList());
for(int i=0;i
我不知道为什么这里需要将“l”指定给“temp”
他不是——那只是:
ArrayList<Integer> temp = l;
诚然,代码是以一种非常奇怪的方式编写的-直到最后一个语句,result
只有一个元素,因此对它进行迭代是毫无意义的-但我相信这解释了您所问的单个语句
我不知道为什么这里需要将“l”指定给“temp”
他不是——那只是:
ArrayList<Integer> temp = l;
诚然,代码是以一种非常奇怪的方式编写的-直到最后一个语句,result
只有一个元素,因此对它进行迭代是毫无意义的-但我相信这可以解释您所询问的单个语句。如果您这样做了
current.add(l);
您将把对ArrayList l
的相同引用添加到current
。因此,如果您在其中一个列表中做了一些更改,那么这两个列表都将被修改。为了避免这个问题
ArrayList<Integer> temp = new ArrayList<Integer>(l);
ArrayList temp=新的ArrayList(l);
您正在创建不同的ArrayList
,但内容相同。因此,它们将是不同的对象(不同的引用)。
current.add(l);
您将把对ArrayList l
的相同引用添加到current
。因此,如果您在其中一个列表中做了一些更改,那么这两个列表都将被修改。为了避免这个问题
ArrayList<Integer> temp = new ArrayList<Integer>(l);
ArrayList temp=新的ArrayList(l);
您正在创建不同的
ArrayList
,但内容相同。因此,它们将是不同的对象(不同的引用)。因此创建“temp”是为了避免进一步修改“l”。因此,如果没有“l.remove(j)”,我仍然可以像“current.add(l)”那样写,对吗?这就解释了“添加”方法只是将引用而不是对象复制到ArrayList中,对吗?@羌:你的评论不是很清楚,但我怀疑你现在的想法是对的。谢谢你的好意。我为此奋斗了很长时间:)呃。。。。谢谢你再次打扰你。但我遇到了一个新问题。因为“add”方法是调用对ArrayList“current”的引用“temp”。但是,在下一次迭代中。临时对象被定向到另一个新对象。这不会改变之前添加的“临时”吗?@Qiang:我不理解你的评论,但我建议你作为一个新的单独问题提问,并用一个简短但完整的例子来说明问题。因此,创建“临时”是为了避免对“l”进行进一步修改。因此,如果没有“l.remove(j)”,我仍然可以像“current.add(l)”那样写,对吗?这就解释了“添加”方法只是将引用而不是对象复制到ArrayList中,对吗?@羌:你的评论不是很清楚,但我怀疑你现在的想法是对的。谢谢你的好意。我为此奋斗了很长时间:)呃。。。。谢谢你再次打扰你。但我遇到了一个新问题。因为“add”方法是调用对ArrayList“current”的引用“temp”。但是,在下一次迭代中。临时对象被定向到另一个新对象。这是否改变了之前添加的“临时工”?@强:我不理解你的评论,但我建议你将其作为一个新的单独问题,用一个简短但完整的例子来说明问题。谢谢你的回答。我知道我在哪里犯了错误。“add”方法只是将引用而不是对象复制到ArrayList。因此,对“l”的进一步修改将影响“当前”。谢谢您的回答。我知道我在哪里犯了错误。“add”方法只是将引用而不是对象复制到ArrayList。因此,对“l”的进一步修改将影响“电流”。