Search code examples
javaalgorithmrecursioncartesian-product

How to create cartesian product over arbitrary groups of numbers in Java?


Let's say I have 2 groups of numbers:

{1, 2, 3},
{4, 5}

I'd like to create an algorithm (in Java) that outputs the following 6 combinations:

1,4
1,5
2,4
2,5
3,4
3,5

There can be an arbitrary number of groups and an arbitrary number of members within each group. So in the above example, there are 2 groups with the first group having 3 members and the second group having 2 members. Another example is the following (3 groups, 3 members in first groups and 2 members in second and third groups):

{1, 2, 3},
{4, 5},
{6, 7}

Which would yield the following 12 combinations:

1,4,6
1,4,7
1,5,6
1,5,7

2,4,6
2,4,7
2,5,6
2,5,7

3,4,6
3,4,7
3,5,6
3,5,7

How can I do this in Java? I'm trying to use recursion and I've looked at a similar question already but I'm still coming up short. Thanks for the help! (P.S. this is not for a homework assignment)


Solution

  • Got a bit bored and decided to give it a shot. Should be exactly what you need:

    public static void main(String args[]) {
        ArrayList<int[]> input = new ArrayList<int[]>();
        input.add(new int[]{1, 2, 3});
        input.add(new int[]{4, 5});
        input.add(new int[]{6, 7});
    
        combine(input, new int[input.size()], 0);
    }
    
    private static void combine(ArrayList<int[]> input, int[] current, int k) {
        if (k == input.size()) {
            for (int i = 0; i < k; i++) {
                System.out.print(current[i] + " ");
            }
            System.out.println();
        } else {
            for (int j = 0; j < input.get(k).length; j++) {
                current[k] = input.get(k)[j];
                combine(input, current, k + 1);
            }
        }
    }