2011-11-16 63 views
0

我有一個Java哈希字符串的ArrayList字符串組合的結構是這樣的:從存儲在HashMap中

HashMap<Integer, ArrayList<String>> finalMap = new HashMap<Integer, ArrayList<String>>(); 

finalMap.toString()是這樣

{0=[a1, a2, a3, a4], 1=[b1, b2, b3], 2=[c1, c2], 3=[d1]} 

我需要生成所有的一些事情組合是這樣的:

1. a1 b1 c1 d1 
2. a1 b1 c2 d1 
3. a1 b2 c1 d1 
4. a1 b2 c2 d1 
5. a1 b3 c1 d1 
6. a1 b3 c2 d1 
... 
... 
... 
... 
... 

在此先感謝。

+1

你嘗試過什麼了嗎? – khr055

+0

雖然在hashmap上迭代,但我不明白如何遍歷所有元素 – Elvis

+1

請發佈代碼,你有問題。一般而言,在不顯示任何努力的情況下尋求完整的解決方案並不受歡迎。 –

回答

1

簡單地暴露所有元素並跳過重複項(由HashSet自動完成)。有更好的方法來Concat的字符串,但保持它簡單:

HashSet<String> result = new HashSet<String>(); 

for (String a : finalMap.get(0)) { 
    for (String b : finalMap.get(1)) { 
     for (String c : finalMap.get(2)) { 
      for (String d : finalMap.get(3)) { 
       result.add(a + b + c + d); 
      } 
     } 
    } 
} 
System.out.println(result); 

輸出應該像
[a3b2c1d1, a1b3c1d1, a1b1c1d1, a1b2c2d1, a4b1c2d1, a4b3c2d1, a1b2c1d1, a2b1c2d1, a2b2c2d1, a3b3c2d1, a1b1c2d1, a1b3c2d1, a2b3c2d1, a3b3c1d1, a2b2c1d1, a4b1c1d1, a4b3c1d1, a4b2c1d1, a3b1c2d1, a2b3c1d1, a3b1c1d1, a4b2c2d1, a2b1c1d1, a3b2c2d1]

但是,如果你不知道名單的總量又或者他們可能會有所不同,你可能使用遞歸的方法

void generate(HashSet<String> resultList, String resultString, 
     int listNum, HashMap<Integer, ArrayList<String>> data) { 
    if (listNum == 0) { 
     // start: begin a new resultString 
     for (int i = 0; i < data.get(listNum).size(); i++) { 
      generate(resultList, data.get(listNum).get(i), listNum + 1, 
        data); 
     } 
    } else if (listNum == data.size() - 1) { 
     // end: store completed resultStrings 
     for (int i = 0; i < data.get(listNum).size(); i++) { 
      resultList.add(resultString + data.get(listNum).get(i)); 
     } 
    } else { 
     // middlepart: append current string to given resultString 
     for (int i = 0; i < data.get(listNum).size(); i++) { 
      generate(resultList, resultString + data.get(listNum).get(i), 
        listNum + 1, data); 
     } 
    } 
} 

稱爲如下:

HashSet<String> result = new HashSet<String>(); 
generate(result2, null, 0, finalMap); 
System.out.println(result); 

輸出也應該像
[a3b2c1d1, a1b3c1d1, a1b1c1d1, a1b2c2d1, a4b1c2d1, a4b3c2d1, a1b2c1d1, a2b1c2d1, a2b2c2d1, a3b3c2d1, a1b1c2d1, a1b3c2d1, a2b3c2d1, a3b3c1d1, a2b2c1d1, a4b1c1d1, a4b3c1d1, a4b2c1d1, a3b1c2d1, a2b3c1d1, a3b1c1d1, a4b2c2d1, a2b1c1d1, a3b2c2d1]

+0

在這裏,我不知道有多少陣列存在,就像你已經給出瞭解決方案高達4. – Elvis

+0

偉大的...謝謝xmoex – Elvis

+0

我添加了一個遞歸的解決方案,應該做的工作... ps:不客氣 – xmoex