2012-11-03 38 views
3

我試圖將每個元素相互包含String []相互交叉。輸入列表中的每個元素(String[])將長度3或4與列表中的每個元素相交<string[]>與另一個

Input: [{'J', 'K', 'L'}, {'G', 'H', 'I'}] 
Output: ["JG", "JH", "JI", 
     "KG", "KH", "KI", 
     "LG", "LH", "LI"] 

Input: [{'J', 'K', 'L'}, {'G', 'H', 'I'}, {'A', 'B', 'C'}] 
Output: ["JGA", "JGB", "JGC", 
     "KGA", "KGB", "KGC", 
     "LGA", "LGB", "LGC", 
     "JHA", "JHB", "JHC", 
     "KHA", "KHB", "KHC", 
     "LHA", "LHB", "LHC", 
     "JIA", "JIB", "JIC", 
     "KIA", "KIB", "KIC", 
     "LIA", "LIB", "LIC"] 

在輸出的各元素的大小等於輸入列表中的總的元件。

我做了以下,但沒有得到正確的結果。

ArrayList<String> output = new ArrayList(); 
for (String [] s : InputList) 
    for (int i = 0; i < s.length; i++) { 
     if (output.size < 3) 
     output.add(s[i]) 
     else { 
     output.add(output.get(i)+s[i]); 
     } 
    } 
} 
+0

這是類似的:http://stackoverflow.com/questions/11110174/java-get-all-concatenations-of-listliststring – fgb

回答

1

你可以使用遞歸方法。這對任何(合理的)大小的名單工作:

public static List<String> combine(List<String[]> list) { 
    List<String> elements = new ArrayList<String>(); 
    if (!list.isEmpty()) { 
     String[] head = list.get(0); 
     List<String> tail; 
     if (list.size() > 1) { 
      tail = combine(list.subList(1, list.size())); 
     } else { 
      tail = Arrays.asList(""); 
     } 
     for (String headElem : head) { 
      for (String tailElem : tail) { 
       elements.add(headElem + tailElem); 
      } 
     } 
    } 
    return elements; 
} 
0

這裏是一個非遞歸版本,如果你仍然有興趣:

public String[] cartesian(char input[][]) {     
    List<String> output = new ArrayList<String>();   
    int m = input.length;         
    int n = input[0].length;         
    int c[] = new int[m];         
    int i = m - 1;           
    do {              
     output.add(getElement(input, c, m));     
     do {             
      if (c[i] < n - 1) {        
       c[i]++;          
       if (i < m - 1)        
        i++;          
       break;          
      } else {           
       c[i] = 0;         
       i--;           
      }            
     } while (i >= 0);         
    } while (i >= 0);          
    return output.toArray(new String[output.size()]);  
}               

private String getElement(char[][] list, int[] c, int n) { 
    String element = "";          
    for (int i = 0; i < n; i++)        
     element += list[i][c[i]];       
    return element;           
}               

您應該能夠使用任意數量的子表。對於你的情況你可以這樣做:

char[][] input={{'J', 'K', 'L'}, {'G', 'H', 'I'}, {'A', 'B', 'C'}}; 
String[] output = cartesian(input);         
+0

但他希望所有的可能的組合。 – Mordechai

+0

是的,所有的組合都是我的情況的問題。 – birdy

+0

@birdy明白了,但那不是一個十字路口,它是笛卡爾產品的變體。 – dan

相關問題