Java ArrayList初始化

Java ArrayList初始化,java,arraylist,function-parameter,Java,Arraylist,Function Parameter,我一直在试图理解下面的代码,它使用深度优先搜索(DFS)打印出由数字[1..n]组成的长度k的所有唯一组合 请参阅专用dfs函数中注释为“怀疑”的行 public ArrayList<ArrayList<Integer>> combine(int n, int k) { ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>()

我一直在试图理解下面的代码,它使用深度优先搜索(DFS)打印出由数字[1..n]组成的长度k的所有唯一组合

请参阅专用dfs函数中注释为“怀疑”的行

public ArrayList<ArrayList<Integer>> combine(int n, int k) {
    ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
    if (n <= 0 || n < k)
        return result;
    ArrayList<Integer> item = new ArrayList<Integer>();
    dfs(n, k, 1, item, result); 
    return result;
}

private void dfs(int n, int k, int start, ArrayList<Integer> item,
        ArrayList<ArrayList<Integer>> res) {
    if (item.size() == k) {
        res.add(new ArrayList<Integer>(item)); /*doubt*/
        return;
    }

    for (int i = start; i <= n; i++) {
        item.add(i);
        dfs(n, k, i + 1, item, res);
        item.remove(item.size() - 1);
    }
}
公共数组列表组合(int n,int k){
ArrayList结果=新建ArrayList();

如果(n那么你的问题涉及这两种选择:

// works
res.add(new ArrayList<Integer>(item));

// won't work, results in empty lists
res.add(item);

添加到
项中的每个元素以后都将被删除。这就是为什么在没有克隆步骤的情况下会出现空列表。没有克隆,不仅会得到一个空列表列表,而且所有空列表实际上都是在第一次调用
dfs
之前在
combine
中创建的相同原始
ArrayList
>.

这是因为
item.remove(item.size()-1);
正在修改您刚刚添加到结果列表中的同一列表。因此,它总是会删除所有项目。您的解决方案实际上是复制项目列表并将其存储在结果列表中。没有人引用该列表,因此它不会被修改。

因为您正在修改由
i指向的同一列表tem
在for循环中。这也将修改存储在
res
列表中的引用的列表。
for (int i = start; i <= n; i++) {
    item.add(i);
    dfs(n, k, i + 1, item, res);
    item.remove(item.size() - 1);
}