2011-03-12 59 views
5

我的應用使用TreeMap來保持數據排序並具有log(n)查找&插入。在應用程序運行時,這在一般情況下效果很好,但是當應用程序首次啓動時,我需要初始化具有幾百萬長的TreeMap,我在排序的訂單(升序)中獲得。如何用預先排序的數據初始化TreeMap?

因爲這些初始化值已經排序,有沒有辦法將它們插入到映像樹無需支付日誌樹的插入和再平衡(n)的成本是多少?

+0

如果有的話,我會非常驚訝。 – corsiKa 2011-03-12 00:33:40

+0

什麼是您的'初始化值'數據結構?名單?或HashMap? – 2011-03-12 00:53:37

回答

10

當然! TreeMap.putAll方法(以及接受SortedMap的TreeMap構造函數)在內部調用名爲buildFromSorted的方法,文檔中將其描述爲:「來自排序數據的線性時間樹構建算法」,以便聽起來像是按照您的要求進行操作。

只要給putAll方法實現Map,但地圖的入口集迭代器(Map.entrySet().iterator())返回排序值列表。

+0

謝謝,這正是我所需要的,儘管它需要一些爭論將我的初始化數字列表變成看起來像SortedMap的東西。 – 2011-03-12 00:59:47

+0

它實際上可能不是。我編輯答案說使用LinkedHashMap - 你可以把你的數字按順序排列,迭代器將保存你添加它們的順序。 – Neil 2011-03-12 01:11:05

+2

LinkedHashMap沒有實現SortedMap接口,所以我不認爲會使用buildFromSorted方法。相反,我必須創建一個SortedMap的匿名實現,它是一個匿名實現,它內部是一個匿名實現,它內部是一個匿名實現,裏面是一個匿名實現。醜陋而冗長如罪,但做這份工作。 – 2011-03-12 01:20:42