题目来源:https://leetcode-cn.com/problems/display-table-of-food-orders-in-a-restaurant/
大致题意:
给定一个List<List<String>>类型的数据,里面是有多个字符串列表组成的点菜单列表。每个字符串列表的数据按索引顺序有三个部分:客户名称、桌号、点菜名。
我们需要输出一个List<List<String>>类型的数据,数据第一个字符串列表开头是Table,之后是所有桌号点过的所有菜种类(按字典序排序),可以视为一个表格的列名。其他列表按照桌号顺序,第一个元素是桌号,然后依次为每个桌号的对应于第一行菜品的点菜数量。
思路
先遍历点菜单列表,统计出两个信息:
- 所有的菜品
- 每个桌号所点过的菜品,以及对应的菜品数量
这里可以使用TreeMap存储,默认按照字典序和自然数顺序对表排序。
然后获取菜单列表,和字符串Table组合后插入为答案列表第一个元素。
接着依次遍历对应的桌号,每个桌号再遍历菜单列表,然后查找桌号TreeMap对应的点菜单,统计出该桌号对应于菜单所点的菜品数量列表,然后将桌号和菜品数量列表组合成新的列表插入答案列表。
代码如下:
public List<List<String>> displayTable(List<List<String>> orders) {
TreeMap<String, Integer> food = new TreeMap<String, Integer>(); // 存菜单
TreeMap<Integer, Map<String, Integer>> guest = new TreeMap<Integer, Map<String, Integer>>(); // 桌号和对应的点菜数
for (List<String> order : orders) {
String stuff = order.get(2); // 获取菜名
food.put(stuff, 1);
int table = Integer.parseInt(order.get(1)); // 获取桌号
Map<String, Integer> guestMap = guest.getOrDefault(table, new HashMap<String, Integer>()); // 获取桌号对应的点菜单,若无则新建
guestMap.put(stuff, guestMap.getOrDefault(stuff, 0) + 1); // 获取对应菜品的点单数(若无则为0)然后加一
guest.put(table, guestMap); // 更新点菜单
}
List<String> nameList = new ArrayList<String>(food.keySet()); // 菜单列表
List<Integer> tableList = new ArrayList<Integer>(guest.keySet()); // 桌号列表
List<List<String>> ansTable = new ArrayList<List<String>>(); // 答案菜单
List<String> header = new ArrayList<String>(); // 菜单头部
header.add("Table");
for (String stuff : nameList) { // 组合
header.add(stuff);
}
ansTable.add(header); // 添加头部
for (int table : tableList) { // 添加每个桌号对应的点菜信息
List<String> rowList = new ArrayList<String>(); // 创建每一行(桌号对应)的列表
rowList.add(String.valueOf(table)); // 添加桌号
Map<String, Integer> rowMap = guest.get(table); // 获取桌号对应的点菜单
for (String name : nameList) {
int num = rowMap.getOrDefault(name, 0); // 获取该桌号对应菜品的单数,若无则为0
rowList.add(String.valueOf(num)); // 添加该菜品点菜信息
}
ansTable.add(rowList); // 添加所有点菜信息
}
return ansTable;
}
收获:
- 如果TreeMap的key为String,而String存的是数字对应字符,则无法默认按照数字的自然数顺序对表排序
- Map的getOrDefault(key, defaultValue)方法,是按照key获取对应的Value,若无该key,则获取设置的defaultValue