我想知道解决以下问题的最佳方法是:
我现在有Map<String, Collection<String>>
。让我们说一下用餐时可以提供的一系列饮料。 E.g。
午餐 - 橙汁 午餐 - 苏打水 午餐 - 啤酒
晚餐 - 苏打水 晚餐 - 啤酒 晚餐 - 葡萄酒
所以我的收藏真的是Map<Meal, Collection<Beverage>>
我需要做的是在膳食中创建所有各种饮料组合的List<Map<String,String>>
。在这种情况下,我将有18种组合。 E.g。
[
[ 早餐 - &gt;橙汁, 午餐 - &gt;橙汁, 晚餐 - &gt;苏打 ]
[ 早餐 - &gt;橙汁, 午餐 - &gt;橙汁, 晚餐 - &gt;啤酒 ]
[ 早餐 - &gt;橙汁, 午餐 - &gt;橙汁, 晚餐 - &gt;葡萄酒 ]
[ 早餐 - &gt;橙汁, 午餐 - &gt;苏打, 晚餐 - &gt;苏打, ]
...等 ]
我很想知道其他人如何创建最终的系列。
另外,我正在使用java,所以很好的功能是不受限制的。
由于
膳食类型是动态的。也就是说,可以从列表中删除晚餐或添加早午餐。
答案 0 :(得分: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);
}
}
没有经过测试,但你明白了。
答案 1 :(得分:0)
使用一组计数器,其中包含尽可能多的计数器。在循环中增加第一个,直到它达到第一餐的最后一个饮料,然后增加下一个(逐渐减少)。当达到最后一餐的最后一餐时,你就完成了。
我会把代码留给你。