2012-11-20 9 views
13

如果我想在Firebase中維護有序列表,似乎最好的方法是手動爲列表中的每個項目分配優先級。這意味着如果我從列表中插入或刪除一個項目,我必須更新它後面的所有項目的優先級。對於列表開頭的項目,這意味着更新列表中的每個項目。在這種情況下是否有更好的執行數據結構或算法?Firebase中有序列表的性能

+0

我編輯這個要求更好的ds.s.或算法 - 唯一公平的答案是「這足夠快嗎?」是「你介紹了嗎?」 – djechlin

+0

排序算法是什麼?按字母順序排列?數值?按時間戳?我發現自己在思考關於Firebase的這些模糊問題,並且通常會發現,一旦我仔細確定了期望的行爲,它們就容易解決。 – Kato

回答

4

您可以通過適當設置元素的優先級來創建一個有序列表。列表中的項目按照優先級順序排列,或者如果優先級可以通過數字值解析爲數字。

如果您想要將項目插入現有列表的中間,那麼修改現有項目的優先級就可以工作,但效率會非常低。更好的方法是在要插入值的兩個項目之間選擇優先級,併爲新項目設置優先級。例如,如果元素1的優先級爲「a」,元素2的優先級爲「b」,則可以在優先級爲「aa」(或「aq」,「az」的元素2之間插入元素3,等等)。

根據我們的經驗,大多數時候當您創建一個有序列表時,您並不一定知道列表中您想要事先插入該項目的位置。例如,如果您正在創建一個遊戲的排行榜,您不會事先知道您想在列表中放置一個新的第3個分數,而是您知道您想將它插入任何位置得分10000得到您(這可能是第三次)。在這種情況下,只需將分數設置爲優先就可以實現這一點。在這裏看到我們的領導委員會的例子: https://www.firebase.com/tutorial/#example-leaderboard

+3

感謝您的回覆如此之快。在這種情況下,我想創建一個拖放列表,所以排序由用戶定義。我喜歡在兩個期望項目之間插入優先級的想法,但是我陷入了一件事情:當你使用'child_added'回調時,你怎麼知道下一個項目是什麼?你只能得到以前的項目,而不是之後的項目。 –

+1

您是否曾經爲任意順序列表找到好的解決方案@RadfordSmith? –

0

Ruby寶石ranked_model有一個有趣的方法來解決這個問題。它使用像許多其他「充當列表」實現的位置整數,但不依賴於在每個位置移動時重寫所有整數。相反,它將整數分隔得很遠,因此每個更新只能影響一行或兩行。可能值得瀏覽自述文件​​和代碼,看看這種方法是否適合這裏。