You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何先修改Food评分后无法从SortedSet中删除该元素?

设计美食评分系统SortedSet操作问题解析

问题背景

在LeetCode「设计美食评分系统」问题实现中,使用SortedSet为每个菜系维护按(-评分, 食物名字典序)排序的食物集合时,changeRating方法若先修改食物评分再调用SortedSet.discard删除食物,会出现'sushi' not in List的错误;但调整为先删除旧状态食物→修改评分→重新添加新状态食物的流程则正常运行。

核心原因

  • SortedSet的元素匹配依赖当前比较键:SortedSet是基于元素的比较规则(此处为(-评分, 食物名))来维护有序性、判断元素是否存在的。当你先修改食物的评分,该食物对应的比较键已经从(-旧评分, 食物名)变成了(-新评分, 食物名),但SortedSet内部存储的还是旧键对应的元素状态。此时调用discard时,会根据修改后的新键去集合中查找,自然找不到旧键对应的元素,因此报错“元素不存在”。
  • SortedSet无法感知元素内部状态变更:SortedSet不会主动监听集合内元素的内部属性变化,一旦元素插入,它只会基于插入时的比较键来维护索引和有序结构。当元素的评分(影响比较键的属性)被修改后,元素在SortedSet中的逻辑位置和标识已经失效,但集合本身不会自动更新这些信息,导致后续的查找/删除操作无法匹配到原元素。

正确流程的合理性

先调用discard删除元素时,元素的比较键还是插入时的旧值,能精准匹配到SortedSet中存储的条目;修改评分后,元素的比较键更新为新值,此时重新插入SortedSet,集合会基于新的比较键将元素放到正确的有序位置,整个流程能保证集合状态的一致性。

内容的提问来源于stack exchange,提问作者Anunad Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 16:42:18