无法在java中的二维列表中推送元素

时间:2015-11-21 20:37:44

标签: java arraylist

我在子集中推送子集列表,二维列表但是返回的值是一个空的二维列表,为什么?

public class Solution {
  public List<List<Integer>> subsets(int[] nums) {

    List<Integer> subset = new ArrayList<>();
    List<List<Integer>> subsets = new ArrayList<>();

    int x = (int) Math.pow(2,nums.length);
    for(int i=0;i<x;i++){
        for(int j=0;j<nums.length;j++){
            if((i & (1<<j))!=0)
                subset.add(nums[j]);
        }
        Collections.sort(subset);
        subsets.add(subset);
        subset.clear();
    }
    return subsets;
  }
}

2 个答案:

答案 0 :(得分:0)

查看你的代码,

 subsets.add(subset);
 subset.clear();

您要添加列表,然后擦除内容。

我建议你将subset的实例化移动到你的循环中,然后在每次迭代时你将有新的子元素

答案 1 :(得分:-1)

当您致电List#add(var)时,您需要存储var点的相同引用,现在该引用来自两个地方:List内部和var内部。由于您不存储列表的副本,但varList引用的相同列表是可变的,因此当您更改var的状态时,此更改也将是反映在存储在另一个容器内的列表中。

在您当前的代码中,您在将subset#clear添加到subset后调用了subsets,因此您需要清除subset的内容,存储在subset中的列表对象引用也会受到影响(因为它毕竟是相同的列表)。如果要继续使用相同的列表添加元素,则应创建一个新的对象引用,如下所示:

subsets.add(subset);
//subset.clear();
subset = new Arrayist<>();