如果我想在 Firebase 中维护一个有序列表,最好的方法似乎是手动为列表中的每个项目分配优先级。这意味着如果我从列表中插入或删除一个项目,我必须更新它后面所有项目的优先级。对于列表开头的项目,这意味着更新列表中的每个项目。在这种情况下是否有更好的数据结构或算法可以使用?
2 回答
您可以通过适当地设置元素的优先级来创建有序列表。列表中的项目按优先级按字典顺序排序,或者如果优先级可以解析为数字,则按数值排序。
如果您想将项目插入现有列表的中间,修改现有项目的优先级会起作用,但效率会非常低。更好的方法是在要插入值的两个项目之间选择一个优先级,并为新项目设置该优先级。
例如,如果元素 1 的优先级为“a”,元素 2 的优先级为“b”,则可以在两者之间插入元素 3,优先级为“aa”(或“aq”、“az”等)。
根据我们的经验,大多数情况下,当您创建有序列表时,您不一定事先知道要在列表中插入项目的位置。例如,如果您正在为游戏创建排行榜,您事先并不知道要将新分数放在列表中的第 3 位,而是知道要将其插入到分数 10000 获得的任何位置(可能恰好是第三个)。在这种情况下,只需将优先级设置为分数即可完成此操作。在此处查看我们的排行榜示例: https ://www.firebase.com/tutorial/#example-leaderboard
Ruby gem排名模型有一个有趣的方法来解决这个问题。它像许多其他“充当列表”实现一样使用位置整数,但它不依赖于重写每个位置移动的所有整数。相反,它将整数分开很远,因此每次更新可能只影响一两行。可能值得阅读自述文件和代码,看看这种方法是否适合这里。