2011-05-06 92 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