这一题主要考察的就是数据的存储和处理,思路其实很简单
思路
思路很简单,需要注意的是:
- 第一行要手动添加“Table”列名;
- 桌子编号是升序排列;
- 菜名是按字母序排列;
其他的就按部就班的处理即可。
不知道具体是什么原因,在进行排序时,我最先使用的是优先队列进行排序(用的比较少,所以想多用一用),但是都没能达到想要的结果,白给两次。。。后面换成Collections.sort()对列表进行排序才AC;
算法步骤:
- 使用
Set存储菜名
,使用Map存储每桌的点菜信息
; - 每当遇到一个菜名,判断其是否在已有的
菜单meal
中,没有的话进行添加; - 每当遇到一个桌号,判断其是否在
map
中,没有的话直接添加到map中并添加点菜信息,且菜的数量直接置为1即可;有的话需要先判断是否一定点过当前的菜,点过的话直接进行累加,没有的话进行添加; - 下面是对数据进行处理,首先
手动添加"Table"到title列表
中,然后把Set集合meal中的数据转存到l1
中,然后对l1中的数据进行排序
,将其结果依次存到title中
,然后将title存到结果列表ans
中; - 对于每一桌的信息,首先
对桌号进行排序(与对菜名进行排序一样,首先将桌号转存到l2中,然后对l2进行排序)
,然后按照桌号升序的顺序对每一桌的信息进行处理
; - 因为前面处理过的
l1列表是按照字母序排列的菜名
,所以直接依次获取对应菜名在当前桌的信息即可,有的话则是对应的数量,没有的话是0;将每一桌的信息依次添加到结果列表ans中; - 最后返回ans;
代码
class Solution {
public List<List<String>> displayTable(List<List<String>> orders) {
int len = orders.size();
//存储菜名
Set<String> meal = new HashSet<>();
//分别存储桌子编号和菜品
Map<Integer,Map<String, Integer>> map = new HashMap<>();
for(List<String> i : orders)
{
int tab_id = Integer.parseInt(i.get(1));
String meal_name = i.get(2);
//检查菜名是否出现过,未出现过则添加到set
if (!meal.contains(meal_name))
meal.add(meal_name);
//检查是否出现过该桌
if (!map.containsKey(tab_id))
{
Map<String, Integer> cur = new HashMap<>();
cur.put(meal_name,1);
map.put(tab_id,cur);
}
else
{
Map<String, Integer> cur = map.get(tab_id);
int n = cur.get(meal_name)==null?0:cur.get(meal_name);
cur.put(meal_name,n+1);
map.put(tab_id,cur);
}
}
//在答案中添加第一行
List<List<String>> ans = new ArrayList<>();
List<String> title = new ArrayList<>();
List<String> l1 = new ArrayList<>();
l1.addAll(meal);
Collections.sort(l1);
title.add("Table");
title.addAll(l1);
ans.add(title);
//在答案中添加对应的数据
List<Integer> l2 = new ArrayList<>();
l2.addAll(map.keySet());
Collections.sort(l2);
for (int i : l2)
{
List<String> ll = new ArrayList<>();
Map<String, Integer> m = map.get(i);
ll.add(String.valueOf(i));
for (String j : l1)
{
String str = m.get(j)==null?"0":String.valueOf(m.get(j));
ll.add(str);
}
ans.add(ll);
}
return ans;
}
}