Java中List<List<Integer>>类型转换错误及遍历问题求助
咱们先把你遇到的问题拆解清楚,一步步解决:
1. 类型不兼容错误的核心原因
你写for(ArrayList<Integer> subset:allsubsets)时触发错误,是因为allsubsets的类型是List<List<Integer>>——它里面的元素被声明为List
2. 关于List接口的add/addAll方法的误解
你提到改成for(List<Integer> subset:allsubsets)会提示List没有add、addAll方法,这其实是个误区——List接口本身就定义了add()和addAll()方法,所有实现List的类(比如ArrayList)都必须实现这些方法。所以用List
3. 代码里隐藏的另一个关键bug
你的代码还有个容易忽略的错误:allsubsets.add(moresubsets);这里应该用addAll()而非add()。因为moresubsets是List<List<Integer>>,用add()会把整个moresubsets作为单个元素加到allsubsets里,导致最终结构变成List<List<List<Integer>>>,完全偏离了你想要的List<List<Integer>>。
修正后的完整代码
下面是修复了所有问题的代码,同时还修正了一个索引越界的小问题:
public List<List<Integer>> subsets(int[] nums) { List<Integer> arrayList = new ArrayList<Integer>(); for(int i:nums) { arrayList.add(i); } return subsets(arrayList, nums.length - 1); // 原代码传入nums.length会导致索引越界,List索引从0开始 } public List<List<Integer>> subsets(List<Integer> arrayList, int index) { List<List<Integer>> allsubsets; if(index == -1) { allsubsets = new ArrayList<List<Integer>>(); allsubsets.add(new ArrayList<Integer>()); } else { allsubsets = subsets(arrayList, index - 1); int item = arrayList.get(index); List<List<Integer>> moresubsets = new ArrayList<List<Integer>>(); // 用List<Integer>遍历,正常调用add/addAll方法 for(List<Integer> subset : allsubsets) { List<Integer> newsubset = new ArrayList<Integer>(); newsubset.addAll(subset); newsubset.add(item); moresubsets.add(newsubset); } // 用addAll将moresubsets中的所有子集合并到allsubsets allsubsets.addAll(moresubsets); } return allsubsets; }
额外提醒
原代码中subsets(arrayList, nums.length)会触发索引越界,因为数组长度为n时,List的最大有效索引是n-1,所以要改成nums.length - 1,否则第一次调用arrayList.get(index)就会抛出异常。
这样修改后,代码既能保持你想要的List<List<Integer>>返回类型,又能正确遍历和操作所有子集。
内容的提问来源于stack exchange,提问作者zealouscoder

