java中两个列表的组合

时间:2015-02-12 07:41:03

标签: java algorithm combinations probability

是否有任何算法可以实现这种输出组合? 输入:

arr1 = {x, y, z}
arr2 = {a, b}

输出:

xa, ya, za
xa, ya, zb
xa, yb, za
xa, yb, zb
xb, ya, za
xb, ya, zb
xb, yb, za
xb, yb, zb

3 个答案:

答案 0 :(得分:3)

static char[] arr1 = {'x', 'y', 'z'};
static char[] arr2 = {'a', 'b'};

public static void main(String[] args) {
    print(new char[arr1.length - 1], 0);
}

static void print(char[] store, int depth) {
    for(char c : arr2) {
        if(depth < store.length) {
            store[depth] = c;
            print(store, depth + 1);
        } else {
            for(int i = 0; i < store.length; i++) {
                System.out.print(arr1[i] + "" + store[i] + ", ");
            }
            System.out.println(arr1[depth] + "" + c);
        }
    }
}

编辑:无法抗拒试用@ DenisKulagin的方法,所以这里有:

public static void main(String[] args) {
    char[] arr1 = {'x', 'y', 'z'};
    char[] arr2 = {'a', 'b'};

    for(int i = 0; i < 1 << arr1.length; i++) {
        for(int j = 0; j < arr1.length; j++) {
            int inverted = arr1.length - 1 - j;
            int index = (i & (1 << inverted)) >>> inverted;
            System.out.print(arr1[j] + "" + arr2[index] + " ");
        }
        System.out.println();
    }
}

不像我的版本那么灵活,因为arr2只能包含2个元素,但绝对是一个聪明的方法。

答案 1 :(得分:1)

  1. 将{a,a,a}编码为{0,0,0} - 0 /二进制。
  2. 将{b,b,b}编码为{1,1,1} - 7 /二进制。
  3. 循环0..7,加入{x,y,z}&amp;结果是3元组。
  4. 利润!

答案 2 :(得分:0)

它可能是2次幂3(arr2.length power arr1.length)。这应该给出行数。

因此,您需要一个计算每一行的算法。较短的一个给出数字,而较长的一个给出指数。