给你一个数组 orders,表示客户在餐厅中完成的订单,确切地说, orders[i]=[customerNamei,tableNumberi,foodItemi] ,其中 customerNamei 是客户的姓名,tableNumberi 是客户所在餐桌的桌号,而 foodItemi 是客户点的餐品名称。
请你返回该餐厅的 点菜展示表 。在这张表中,表中第一行为标题,其第一列为餐桌桌号 “Table” ,后面每一列都是按字母顺序排列的餐品名称。接下来每一行中的项则表示每张餐桌订购的相应餐品数量,第一列应当填对应的桌号,后面依次填写下单的餐品数量。
注意:客户姓名不是点菜展示表的一部分。此外,表中的数据行应该按餐桌桌号升序排列。
输入:orders = [[“David”,“3”,“Ceviche”],[“Corina”,“10”,“Beef Burrito”],[“David”,“3”,“Fried Chicken”],[“Carla”,“5”,“Water”],[“Carla”,“5”,“Ceviche”],[“Rous”,“3”,“Ceviche”]]
输出:[[“Table”,“Beef Burrito”,“Ceviche”,“Fried Chicken”,“Water”],[“3”,“0”,“2”,“1”,“0”],[“5”,“0”,“1”,“0”,“1”],[“10”,“1”,“0”,“0”,“0”]]
解释:
点菜展示表如下所示:
Table,Beef Burrito,Ceviche,Fried Chicken,Water
3 ,0 ,2 ,1 ,0
5 ,0 ,1 ,0 ,1
10 ,1 ,0 ,0 ,0
对于餐桌 3:David 点了 “Ceviche” 和 “Fried Chicken”,而 Rous 点了 “Ceviche”
而餐桌 5:Carla 点了 “Water” 和 “Ceviche”
餐桌 10:Corina 点了 “Beef Burrito”
思路:
- 首先提取菜单,统计每一餐桌每一种类的点菜数
- 按照要求排序:菜名按照字母排序,餐桌号按照数字升序排序
- 填写菜单并且输出
import java.util.*;
public class demo {
public static void main(String[] args){
List<List<String>> orders=new ArrayList<>();
List<String> temp =new ArrayList<>();
temp.add("Laura");
temp.add("2");
temp.add("Bean Burrito");
orders.add(new ArrayList<>(temp));//complete the initialization of temp and orders
orders=displayTable(orders);
for (List<String> order:
orders){
System.out.println(order);
}
}
public static List<List<String>> displayTable(List<List<String>> orders) {
// 从订单中获取餐品名称和桌号,统计每桌点餐数量
Set<String> nameSet = new HashSet<String>();//hashsep,具有唯一性和无序性
Map<Integer, Map<String, Integer>> foodsCnt = new HashMap<Integer, Map<String, Integer>>();//统计对应的元组
for (List<String> order : orders) {//提取菜单
nameSet.add(order.get(2));//菜名字
int id = Integer.parseInt(order.get(1));//餐桌序号
// getOrDefault: 如果map中含有指定的key,就返回该key对应的value,否则使用该方法的第二个参数作为默认值返回:
Map<String, Integer> map = foodsCnt.getOrDefault(id, new HashMap<String, Integer>());//看是否存在这个序号的桌子,不存在就新建
map.put(order.get(2), map.getOrDefault(order.get(2), 0) + 1);//给这张桌子添加菜名字和对应的数量
foodsCnt.put(id, map);//提取对应餐桌号,并且统计点餐的菜品以及数量
}
// 提取餐品名称,并按字母顺序排列
int n = nameSet.size();
List<String> names = new ArrayList<String>();
for (String name : nameSet) {
names.add(name);
}
Collections.sort(names);//自动排序
// 提取桌号,并按餐桌桌号升序排列
int m = foodsCnt.size();
List<Integer> ids = new ArrayList<Integer>();
for (int id : foodsCnt.keySet()) {//keySet()返回映射包含的set视图
ids.add(id);
}
Collections.sort(ids);//id自动排序
// 填写点菜展示表
List<List<String>> table = new ArrayList<List<String>>();
List<String> header = new ArrayList<String>();//表头
header.add("Table");//第一个就是table
for (String name : names) {
header.add(name);
}
table.add(header);
for (int i = 0; i < m; ++i) {
int id = ids.get(i);//提取id
Map<String, Integer> cnt = foodsCnt.get(id);//提取这个id的所有的菜单
List<String> row = new ArrayList<String>();//一个元组的内容
row.add(Integer.toString(id));
for (int j = 0; j < n; ++j) {
row.add(Integer.toString(cnt.getOrDefault(names.get(j), 0)));
}
table.add(row);//菜单填写完毕
}
return table;
}
}