2015-02-12 89 views
2

是否有任何算法可以实现这种输出组合? 输入:java中两个列表的组合

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 

回答

0

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

所以你需要一个算法来计算每一行。数字越小,指数越长。

+0

这不是一个笛卡尔产品 – shmosel 2015-02-12 08:00:07

+0

还有什么?您将列表1的每个项目与列表2的每个项目组合在一起。我错了吗? – NwDev 2015-02-12 08:01:54

+0

这只会产生6个项目。 – shmosel 2015-02-12 08:03:59

1
  1. 将{a,a,a}编码为{0,0,0} - 0 /二进制。
  2. 将{b,b,b}编码为{1,1,1} - 7 /二进制。
  3. 循环遍历0..7,加入{x,y,z} &生成3元组。
  4. 利润!
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个元素,但绝对是一个聪明的方法。