
方法: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;
}
}
注意:
- 更新评分时先删除再重新插入, 触发红黑树中节点的旋转。
该博客介绍了一个使用Java实现的食物评分系统,通过Map存储食物信息,TreeSet按烹饪方式对食物进行排序。系统支持按评分降序和食物名字升序排列,并能方便地更新食物评分。最高评分食物查询功能直接返回TreeSet的第一个元素。

被折叠的 条评论
为什么被折叠?



