我正在尝试解决获取子集S = [1,2,3]的所有集合的问题。 我正在使用递归来解决这个问题。我正在尝试在基本案例中创建一个包含EmptyList的空ArrayList。在制作自己的ans时,我上面提到的是编译时错误。
我已经尝试过蚀建议addAll,但仍然出现错误。
public static ArrayList<ArrayList<Integer>> relatedSubSets(ArrayList<Integer> A, int index){
if(index == A.size()){
ArrayList<ArrayList<Integer>> br=new ArrayList<ArrayList<Integer>();
ArrayList<Integer> emptyList=new ArrayList<Integer>();
br.add(emptyList); //Making an arraylist containing empty list
return br;``
}
ArrayList<ArrayList<Integer>> rr=relatedSubSets(A,index+1); // Getting the recursion result in it.
ArrayList<ArrayList<Integer>> mr=new ArrayList<>();
for(int i=0;i<rr.size();i++){
ArrayList<Integer> ans=rr.get(i);
mr.add(ans);
mr.add(ans.add(0,A.get(index))); //Error in this line of the code
}
System.out.println(mr);
return mr;
}
预期输出是所有子集。但是出现编译时错误。
答案 0 :(得分:1)
编译器在检测错误方面做得很好:
您错过了额外的“>”符号:
// wrong:
ArrayList<ArrayList<Integer>> br=new ArrayList<ArrayList<Integer>();
// ok:
ArrayList<ArrayList<Integer>> br=new ArrayList<ArrayList<Integer>>();
现在,由于以下原因,它仍然无法编译:
mr.add(ans.add(0,A.get(index)));
请注意,and.add(...)
返回一个boolean
,因此您可能想要这样的内容:
ans.add(0, A.get(index));
mr.add(ans);
在这种情况下,请认为引用是可变的,因此,如果以后更改ans
数组,那么mr
的元素也会发生变化,因此在其中只需要上述两行即可循环:
for(int i=0;i<rr.size();i++){
ArrayList<Integer> ans=rr.get(i);
mr.add(ans);
ans.add(0,A.get(index));
}
现在可以编译了,所以“技术”部分已解决,您可以集中精力解决任务的“逻辑”部分,祝您好运:)
答案 1 :(得分:0)
mr.add(ans.add(0,A.get(index)));
//代码这一行中的错误
您正在尝试将void返回值添加到arraylist。列表添加方法返回void。所以您遇到以下错误,
ArrayList>类型的add(ArrayList)方法不适用于参数(void)
尝试下面,
ans.add(0,A.get(index)); //Add Integer to ArrayList
mr.add(ans); //Add ArrayList<Integer> to ArrayList