You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何实现从二维数组各子数组选元素的所有组合打印

解决二维数组各子数组选一个元素的全组合问题

兄弟,你现在用固定嵌套循环的写法有两个大问题:一是索引写错了(比如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:53:49