无论数组大小如何,Java多数组递归

时间:2012-02-12 23:00:55

标签: java arrays recursion

我有三个阵列:

{}    
{a, b, c}
{d, e} 

我正在尝试将它们组合起来以获得以下数组:

{a, d}
{a, e}
{b, d}
{b, e}
{c, d} 
{c, e}

我遇到的问题是第一个空数组导致嵌套的for循环根本不运行 - 逻辑上是有意义的。即:

 for (int i = 0; i < bL.size(); i++) {
        for (int j = 0; j < dL.size(); j++) {
            for (int k = 0; k < oL.size(); k++) {

我想要找到的是组合三个数组的最有效方法,无论它们的大小如何。大多数情况下,这三个都有元素,但有些情况下可能会产生一个空集。

任何帮助表示感谢。

编辑:为所有三个阵列添加输出

输入 -     {A,B}     {光盘}     {E,F}

输出 -     {高手}     {A,C,F}     {A,d,E}     {A,d,F}     {B,C,E}     {B,C,F}

编辑:只有第一个或第三个数组才能产生空集

2 个答案:

答案 0 :(得分:0)

假设您正在浏览int值数组,您可以执行以下操作:

void printCombination(int[][] data, List<int> partial) {
    if (partial.size() == data.Length) {
        for (int i : partial) {
            if (i != -1) {
                System.out.writeln(" " + i);
            }
        }
        return;
    }
    if (data[partial.size()].length == 0) {
        partial.add(-1);
        printCombination(data, partial);
        partial.remove(partial.size()-1);
        return;
    }
    for (int i = 0 ; i != data[partial.size()].length; i++) {
        partial.add(data[partial.size()][i]);
        printCombination(data, partial);
        partial.remove(partial.size()-1);
    }
}

初始通话如下:

List<int> partial = new ArrayList();
int[][] data = new int[][] {new int[] {}, new int[] {1,2}, new int[] {3, 4, 5}};
printCombination(data, partial);

答案 1 :(得分:0)

这是一个简单的递归方法,它将结果作为2D ArrayList返回,而不是打印它。

import java.util.ArrayList;

public class Program
{
    public static void main(String[] args)
    {
        String[][] x = { {}, {"a", "b", "c"}, {"d", "e"} };
        System.out.println(cartProd(x));
    }

    public static ArrayList< ArrayList<String> > cartProd(String[][] x)
    {
        return cartProd(x, new ArrayList<String>(), 0);
    }

    public static ArrayList< ArrayList<String> > cartProd(String[][] x, ArrayList<String> current, int index)
    {
        ArrayList< ArrayList<String> > result = new ArrayList< ArrayList<String> >();

        while (index < x.length && x[index].length == 0)
        {
            index++;
        }

        if (index == x.length)
        {
            result.add(new ArrayList<String>(current));
        }
        else
        {
            for (int i = 0; i < x[index].length; i++)
            {
                current.add(x[index][i]);
                result.addAll(cartProd(x, current, index + 1));
                current.remove(current.size() - 1);
            }
        }

        return result;
    }
}