请输入代码
public class Test2 {
private static List<List<Integer>> result;
public static List<List<Integer>> combine(int n,int k){
ArrayList<Integer> temp=new ArrayList<>();
if(n<=0||k<=0||k>n){
return result;
}
generateCombination(n,k,1,temp);
return result;
}
public static void generateCombination(int n,int k,int start,ArrayList<Integer> list){//将从start开始的所有的可能情况放入到list中
if (list.size()==k){
**result.add((List<Integer>) list.clone());**
/*System.out.println(result.toString());*/
return;
}
for(int i=start;i<=n;i++){
list.add(i);
generateCombination(n,k,i+1,list);
list.remove(list.size()-1);
}
}
public static void main(String[] args) {
Scanner sin=new Scanner(System.in);
int N=sin.nextInt();
int K=sin.nextInt();
result=new ArrayList<>();
System.out.println(combine(N,K));
}
}
为什么
result.add(list)
在主程序中打印的时候输出result的都是空呢?
而使用result.add((List<Integer>) list.clone());才能把list中的内容保存到result里边,
就算result里边每一次add都是引用了同一个对象,但是也不应该为空啊?有没有人解答一下?
你这个循环里一直在做“插入一个数,然后再把这个数给删掉”,逻辑最终走完后这个list就是空的。
for(int i=start;i<=n;i++){
list.add(i);
generateCombination(n,k,i+1,list);
list.remove(list.size()-1);
}
既然result里引用的是同一个list,自然输出结果也是空的。而clone后则把这两者的引用关系给隔离开了,操作list就不会对result里的list有任何影响。