2022.07.24(LC_6126_设计食物评分系统)

该博客介绍了一个使用Java实现的食物评分系统,通过Map存储食物信息,TreeSet按烹饪方式对食物进行排序。系统支持按评分降序和食物名字升序排列,并能方便地更新食物评分。最高评分食物查询功能直接返回TreeSet的第一个元素。

 方法:Map+TreeSet

class FoodRatings {
    //用一个食物信息类表示食物的食物名、烹饪方式、评分
    class FoodInfo {
        String food;
        String cuisine;
        int rating;
        FoodInfo(String food, String cuisine, int rating) {
            this.food = food;
            this.cuisine = cuisine;
            this.rating = rating;
        }
    }
    //食物名对应一个食物信息类
    Map<String, FoodInfo> foodInfoMap = new HashMap<>();
    //烹饪方式对应一个TreeSet,TreeSet存放所有这种烹饪方式的食物,并按题意自定义排序
    Map<String, TreeSet<FoodInfo>> cuisineMap = new HashMap<>();
    public FoodRatings(String[] foods, String[] cuisines, int[] ratings) {
        for (int i = 0; i < foods.length; i++) {
            FoodInfo foodInfo = new FoodInfo(foods[i], cuisines[i], ratings[i]);
            foodInfoMap.put(foods[i], foodInfo);
            if (!cuisineMap.containsKey(cuisines[i])) {
                cuisineMap.put(cuisines[i], new TreeSet<>(((o1, o2) -> {
                    //对烹饪方式相同食物的排序规则:首先按评分降序排列,
                    //如果评分相同,则按字典序对食物名字升序排列。
                    if (o1.rating != o2.rating) return o2.rating - o1.rating;
                    return o1.food.compareTo(o2.food);
                })));
            }
            //在烹饪方式对应的TreeSet中添加食物信息
            cuisineMap.get(cuisines[i]).add(foodInfo);
        }
    }
    
    public void changeRating(String food, int newRating) {
        FoodInfo foodInfo = foodInfoMap.get(food);
        //改变评分时需要把TreeSet中的评分信息删掉,不然更改评分后的位置是错的
        //即先删除,然后改评分,最后加入TreeSet找到正确位置
        cuisineMap.get(foodInfo.cuisine).remove(foodInfo);
        foodInfo.rating = newRating;
        cuisineMap.get(foodInfo.cuisine).add(foodInfo);
    }
    
    public String highestRated(String cuisine) {
        //直接返回烹饪方式对应的TreeSet的第一个食物名字
        return cuisineMap.get(cuisine).first().food;
    }
}

注意:

  • 更新评分时先删除再重新插入, 触发红黑树中节点的旋转。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值