2015-02-12 88 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個元素,但絕對是一個聰明的方法。