为什么将ArrayList分配给新的ArrayList temp

时间:2014-06-05 06:02:32

标签: java arraylist

我正在查看leetcode上的Permutations问题的代码。例如, [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);

我不知道为什么这里需要分配&#34; l&#34;到了&#34; temp&#34;。我试过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;
    }
}

2 个答案:

答案 0 :(得分:2)

  

我不知道为什么这里需要将“l”分配给“temp”

他不是 - 那就是:

ArrayList<Integer> temp = l;

相反,代码会在新的l中创建列表ArrayList引用的内容的副本。这意味着对l引用的列表的未来更改(例如之后立即调用l.remove(j))不会影响新列表。

作为一个简单的独立示例,请考虑:

List<String> original = new ArrayList<>();
original.add("foo");
List<String> copy = new ArrayList<>(original);
System.out.println(copy.size()); // 1
original.add("bar");
System.out.println(copy.size()); // Still 1

不可否认,代码是以非常奇怪的方式编写的 - 直到最后的语句,result只有一个元素,所以迭代它是没有意义的 - 但我相信这解释了你要问的单一陈述约。

答案 1 :(得分:2)

如果你做了

current.add(l);

您要将相同的参考添加到ArrayList lcurrent。因此,如果您在其中一个列表中进行了一些更改,则两者都将被修改。为了避免这个问题,请在

行中
ArrayList<Integer> temp = new ArrayList<Integer>(l);

您正在创建不同的ArrayList,但内容相同。因此,它们将是不同的对象(不同的引用)。