Java全排列代码报ClassCastException如何排查修复
异常根本原因
抛出ClassCastException的核心问题出在List<Integer> n = new ArrayList(Arrays.asList(nums));这行:
Arrays.asList()方法做泛型适配时,如果传入的是基本类型数组(比如这里的int[] nums),不会遍历数组把每个int值转为Integer存入列表,而是会把整个int数组对象作为单个元素存入列表,最终得到的实际是List<int[]>类型,和你声明的List<Integer>类型不匹配。- 错误信息里的
[I是JVM中int数组类型的类标识,你在第20行调用nums.get(i)取到的实际是int数组对象,强行转成Integer自然会抛出类型转换异常。
原有逻辑的额外缺陷
除了类型转换错误,递归逻辑还有关键遗漏:
- 你在循环中取出了当前位置的元素
c,但从来没有把这个元素加入当前路径temp中,就算类型问题修复,最终返回的结果也会全是空列表,得不到正确的全排列。
修复后可运行代码
List<List<Integer>> res; public List<List<Integer>> permute(int[] nums) { res = new ArrayList<>(); // 手动遍历int数组转List<Integer>,避开Arrays.asList处理基本类型数组的坑 List<Integer> n = new ArrayList<>(); for (int num : nums) { n.add(num); } permute(n, new ArrayList<>()); return res; } private void permute(List<Integer> nums, List<Integer> cur) { if (nums.size() == 0) { res.add(cur); return; } for (int i = 0; i < nums.size(); ++i) { List<Integer> temp = new ArrayList<>(cur); List<Integer> temp2 = new ArrayList<>(nums); Integer c = nums.get(i); // 把选中的当前元素加入排列路径 temp.add(c); temp2.remove(i); permute(temp2, temp); } }
补充说明
- 如果使用Java 8及以上版本,int数组转
List<Integer>可以用流式写法简化:List<Integer> n = Arrays.stream(nums).boxed().collect(Collectors.toList()); - 原递归思路本身是正确的:每次从未选元素中挑一个加入当前路径,移除该元素后递归处理剩余元素,直到未选元素为空就把当前路径存入结果集。
内容的提问来源于stack exchange,提问作者web1connoisseur
相关产品推荐
相关产品推荐

