力扣 1418. 点菜展示表

题目来源: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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三更鬼

谢谢老板!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值