2011-03-12 57 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