求助:如何实现从二维数组各子数组选元素的所有组合打印
解决二维数组各子数组选一个元素的全组合问题
兄弟,你现在用固定嵌套循环的写法有两个大问题:一是索引写错了(比如x[0][i]里的i是外层循环,遍历的是子数组的个数,而不是第一个子数组的元素索引,运行起来会直接数组越界);二是这种写法完全固定了循环层数,如果以后子数组数量变多或者某个子数组长度改了,代码直接就废了。
要解决这种动态层数的组合遍历,用递归/回溯的思路最合适,能灵活适配任意数量、任意长度的子数组。我给你写个完整的实现:
import java.util.ArrayList; import java.util.List; public class ArrayCombination { public static void main(String[] args) { int[][] x = {{1,2},{3,4,5},{6,7}}; // 调用递归方法,从第0个子数组开始,初始组合为空 generateCombinations(x, 0, new ArrayList<>()); } /** * 递归生成所有组合 * @param arr 原二维数组 * @param currentIndex 当前处理到第几个子数组 * @param currentCombination 当前已经选好的元素组合 */ private static void generateCombinations(int[][] arr, int currentIndex, List<Integer> currentCombination) { // 递归终止条件:所有子数组都处理完了,输出当前组合 if (currentIndex == arr.length) { // 把组合转成逗号分隔的字符串输出 System.out.println(String.join(", ", currentCombination.stream().map(String::valueOf).toArray(String[]::new))); return; } // 遍历当前子数组的每一个元素 for (int num : arr[currentIndex]) { // 把当前元素加入组合 currentCombination.add(num); // 递归处理下一个子数组 generateCombinations(arr, currentIndex + 1, currentCombination); // 回溯:移除刚加入的元素,尝试当前子数组的下一个元素 currentCombination.remove(currentCombination.size() - 1); } } }
代码解释:
- 递归的核心是处理当前子数组→递归下一个→回溯还原的流程,这样能遍历所有可能的组合。
- 终止条件是当
currentIndex等于二维数组的长度时,说明每个子数组都选了一个元素,直接输出即可。 - 用
ArrayList来临时存储当前组合,每次递归后移除最后一个元素,保证回到上一层时组合状态是干净的。
运行这段代码,就能输出你想要的所有组合:
1, 3, 6
1, 3, 7
1, 4, 6
1, 4, 7
1, 5, 6
1, 5, 7
2, 3, 6
2, 3, 7
2, 4, 6
2, 4, 7
2, 5, 6
2, 5, 7
如果以后你的二维数组结构变了(比如多一个子数组{8,9,10}),只需要修改原数组,代码完全不用动,非常灵活~
内容的提问来源于stack exchange,提问作者Java_Beginner
相关产品推荐
相关产品推荐

