Reputation: 1
I'm trying to run the following code where it prints all subsets of a given set. It works when I change the return type of the subsets(int[] nums)
function to ArrayList<ArrayList<Integer>> subsets(int[] nums)
, but not for List<List<Integer>> subsets(int[] nums)
. I need to have the return type as List<List<Integer>>
. How should I fix it?
public class TestPractice {
public static void main(String[] args){
int[] x = {1,2};
System.out.println(subsets(x));
}
public static List<List<Integer>> subsets(int[] nums) {
List<ArrayList<Integer>> subsets = new ArrayList<ArrayList<Integer>>();
if (nums.length ==1){
ArrayList<Integer> subset1 = new ArrayList<Integer>();
ArrayList<Integer> subset2 = new ArrayList<Integer>();
subset2.add(nums[0]);
subsets.add(subset1);
subsets.add(subset2);
return subsets;
}
int[] nums_1 = new int[nums.length-1];
for(int i = 0; i< nums.length-1; i++) {
nums_1[i]=nums[i];
}
List<ArrayList<Integer>> subsets2= subsets(nums_1);
ArrayList<ArrayList<Integer>> final_set = new ArrayList<ArrayList<Integer>>(subsets2);
for(ArrayList<Integer>subset: subsets2) {
ArrayList<Integer> subset1 = new ArrayList<Integer>();
subset1.add(nums[nums.length-1]);
subset1.addAll(subset);
final_set.add(subset1);
}
return final_set;
}
}
Upvotes: 1
Views: 2064
Reputation: 271040
See here for why you can't convert a List<ArrayList>
to a List<List>
.
To fix your error, on the other hand, you can simply not declare your variables as List<ArrayList<Integer>>
and use List<List<Integer>>
instead. You can do this because you are not using any members that only exists in ArrayList
but not List
. You also don't need to specify the generic arguments when instantiating a class, as they can be inferred.
public static List<List<Integer>> subsets(int[] nums) {
// notice the change here!
List<List<Integer>> subsets = new ArrayList<>();
if (nums.length ==1){
ArrayList<Integer> subset1 = new ArrayList<>();
ArrayList<Integer> subset2 = new ArrayList<>();
subset2.add(nums[0]);
subsets.add(subset1);
subsets.add(subset2);
return subsets;
}
int[] nums_1 = new int[nums.length-1];
for(int i = 0; i< nums.length-1; i++) {
nums_1[i]=nums[i];
}
// notice the change here!
List<List<Integer>> subsets2= subsets(nums_1);
// notice the change here!
ArrayList<List<Integer>> final_set = new ArrayList<>(subsets2);
// notice the change here!
for(List<Integer>subset: subsets2) {
ArrayList<Integer> subset1 = new ArrayList<>();
subset1.add(nums[nums.length-1]);
subset1.addAll(subset);
final_set.add(subset1);
}
return final_set;
}
Upvotes: 5