2011-05-06 121 views
0

我想知道解決以下問題的最佳方式是什麼:組合益智遊戲

我此刻Map<String, Collection<String>>。讓我們來說一張餐飲地圖,其中包含您可以在該餐點享用的各種飲料。例如。

早餐 - 橙汁 早餐 - 咖啡

午餐 - 橙汁 午餐 - 蘇打 午餐 - 啤酒

晚餐 - 蘇打 晚餐 - 啤酒 晚餐 - 葡萄酒

所以,我的收藏真的是Map<Meal, Collection<Beverage>>

我需要做的是創建一個List<Map<String,String>>所有各種飲料組合的膳食。我將在這種情況下有18個組合。例如。

[

[ 早餐 - >橙汁, 午餐 - >橙汁, 晚餐 - >蘇打 ]

[ 早餐 - >橙汁, 午餐 - >橙汁, 晚餐 - >啤酒 ]

[ 早餐 - >橙汁, 午餐 - >橙汁, 晚餐 - >葡萄酒 ]

[ 早餐 - >橙汁, 午餐 - >純鹼, 晚餐 - >純鹼, ]

等等 ]

我有興趣瞭解其他人如何創建最終收藏。

此外,我使用java,所以漂亮的功能的東西是關閉的限制。

感謝

編輯

膳食類型是動態的。也就是說,晚餐可以從列表中刪除或添加早午餐。

回答

1

如果我說得對,這裏沒有什麼魔法,只需在嵌套循環中迭代3個集合即可。

for (String breakfastBev : breakfast) { 
    for (String lunchBev : lunch) { 
    for (String dinnerBev : dinner) { 
     System.out.println(breakfastBev + ", " + lunchBev + ", " + dinnerBev); 
    } 
    } 
} 

我敢肯定,現在你可以弄清楚如何與你的Map和輸出List做到這一點。:-)

編輯:對於變更的要求,做到這一點的一種方法是遞歸:

main() { 
    List<Map<String, String>> output = new ArrayList<Map<String, String>>(); 
    recordBeverages(new HashMap(), beveragesByMeal, output); 
} 

void recordBeverages(Map visited, Map meals, List<Map> output) { 
    if(meals.isEmpty()) { 
     output.add(visited); 
    } 
    String mealType = meals.keySet().iterator().next(); 
    Map remainingMeals = new HashMap(visited); 
    remainingMeals.keySet().remove(mealType); 
    for(Beverage bev : meals.get(mealType)) { 
     Map newVisited = new HashMap(visited); 
     newVisited.put(mealType, bev);  

     recordBeverages(newVisited, remainingMeals, output); 
    } 
} 

沒有測試,但你得到的部份的想法。

+0

啊,我應該補充一點,我不知道有多少餐類型。例如。早午餐可以添加。儘管如此,我認爲你可能是正確的,因爲我正在考慮這一點。 – pondermatic 2011-05-06 06:24:09

0

使用具有與正餐一樣多的計數器的計數器陣列。在循環中增加第一個,直到它達到第一餐的最後飲料,然後增加下一個(滴下)。當最後一餐的最後一杯飲料達到時,你就完成了。

我會留下代碼給你。

+0

這就是我已經實現它的方式,所以最好保證它是一個可以接受的方式。謝謝。 – pondermatic 2011-05-06 07:40:43