为什么 remove() for TreeSet<String> 不起作用?



我正试图在https://leetcode.com/problems/design-a-food-rating-system这就是我的解决方案。

class FoodRatings {
class SortedSetComparator implements Comparator<String> {
public int compare(String A, String B) {
if (foodRatingMap.get(A) == foodRatingMap.get(B)) {
return A.compareTo(B);
}
return foodRatingMap.get(B).compareTo(foodRatingMap.get(A));
}
}
Map<String, SortedSet<String>> foodTypeMap;
Map<String, String> foodMap;
Map<String, Integer> foodRatingMap;
public FoodRatings(String[] foods, String[] cuisines, int[] ratings) {
foodTypeMap = new HashMap<>();
foodMap = new HashMap<>();
foodRatingMap = new HashMap<>();
for (int i = 0; i<foods.length; i++) {
foodTypeMap.putIfAbsent(cuisines[i], new TreeSet<String> (new SortedSetComparator()));
foodMap.put(foods[i], cuisines[i]);
foodRatingMap.put(foods[i], ratings[i]);
foodTypeMap.get(cuisines[i]).add(foods[i]);
}
}
public void changeRating(String food, int newRating) {
foodRatingMap.put(food, newRating);
SortedSet<String> set = foodTypeMap.get(foodMap.get(food));
if (!set.remove(food)) {
System.out.println("Unable to find " + food);
}
foodTypeMap.get(foodMap.get(food)).add(food);
}

public String highestRated(String cuisine) {
return foodTypeMap.get(cuisine).first();
}

}

有人能告诉我为什么TreeSet remove((方法不起作用吗?

这是相同的输入。

public static void main(String args[]) {
String[] foods = new String[] {
"czopaaeyl", "lxoozsbh", "kbaxapl"
};
String[] cuisines = new String[] {
"dmnuqeatj", "dmnuqeatj", "dmnuqeatj"
};
int[] ratings = new int[] {
11, 2, 15
};
FoodRatings obj = new MyClass().new FoodRatings(foods, cuisines, ratings);
obj.changeRating("czopaaeyl", 12);
String food = obj.highestRated("dmnuqeatj");
System.out.println(food);
obj.changeRating("kbaxapl", 8);
food = obj.highestRated("dmnuqeatj");
System.out.println(food);
obj.changeRating("lxoozsbh", 5);
food = obj.highestRated("dmnuqeatj");
System.out.println(food);
}

我不知道为什么删除功能在这里不能正常工作。

嗯,我花了一段时间才找到问题。除了整数比较问题之外,它只需要按照词汇顺序对相等的评级进行排序。在删除之前,您正在更新评分。但由于你的集合在比较器中使用了这种结构,所以事情就不同步了。

public void changeRating(String food, int newRating) {
SortedSet<String> set = foodTypeMap.get(foodMap.get(food));
if (!set.remove(food)) {
System.out.println("Unable to find " + food);
}
foodTypeMap.get(foodMap.get(food)).add(food);
foodRatingMap.put(food, newRating);
}

我一把foodRatingMap.put(food, newRating);移到底部,它就起作用了。顺便说一句,我会写一个Food class,包含每种食物类型、等级和烹饪。通常,这些测试站点只对结果和效率感兴趣,而不是你是如何做到的

好吧。这是一个很微妙的问题。首先,评级更新的顺序是错误的。正确的顺序是:-

  1. 将食物从已分拣的食物集中取出
  2. 更新评级
  3. 把食物放回已分拣好的餐具里

在两个地方进行了更改。第一个是纠正顺序。

public void changeRating(String food, int newRating) {
foodTypeMap.get(foodMap.get(food)).remove(food);
foodRatingMap.put(food, newRating);
foodTypeMap.get(foodMap.get(food)).add(food);
}

第二个是在比较器中比较整数值时使用equals((。

class SortedSetComparator implements Comparator<String> {
public int compare(String A, String B) {
if (foodRatingMap.get(A).equals(foodRatingMap.get(B))) {
return A.compareTo(B);
}
return foodRatingMap.get(B).compareTo(foodRatingMap.get(A));
}
}

相关内容

最新更新