如何使用预先排序的数据初始化 TreeMap?

Posted

技术标签:

【中文标题】如何使用预先排序的数据初始化 TreeMap?【英文标题】:How to initialize a TreeMap with pre-sorted data? 【发布时间】:2011-07-13 21:13:12 【问题描述】:

我的应用程序使用 TreeMap 来保持数据排序并进行 log(n) 查找和插入。这在应用程序运行时的一般情况下效果很好,但是当应用程序第一次启动时,我需要用几百万个 long 来初始化 TreeMap,我得到了 sorted order(升序)。

由于这些初始化值已经排序,有没有办法将它们插入到 TreeMap 中而无需支付树插入和重新平衡的 log(n) 成本?

【问题讨论】:

如果有的话,我个人会非常惊讶。 您的“初始化值”数据结构是什么?列表?还是HashMap? 【参考方案1】:

当然! TreeMap.putAll 方法(以及采用 SortedMap 的 TreeMap 构造函数)在内部调用了一个名为 buildFromSorted 的方法,文档中将其描述为:“Linear time tree building algorithm from sorted data”,所以听起来它做了什么你想要的。

只需给 putAll 方法提供一些实现 Map 的东西,但是 map 的 entryset 迭代器 (Map.entrySet().iterator()) 会返回您的排序值列表。

【讨论】:

谢谢,这正是我所需要的,尽管将我的初始化数字列表变成看起来像 SortedMap 的东西需要一些争论。 实际上可能不是。我编辑了答案说使用 LinkedHashMap——你可以把你的数字按顺序排列,迭代器将保留你添加它们的顺序。 LinkedHashMap 没有实现 SortedMap 接口,所以我认为不会使用 buildFromSorted 方法。相反,我必须创建一个 SortedMap 的匿名实现,在其中创建一个 Set 的匿名实现,在其中创建一个迭代器的匿名实现,以及在其中创建一个 Entry 的匿名实现。丑陋而冗长的罪过,但确实有效。

以上是关于如何使用预先排序的数据初始化 TreeMap?的主要内容,如果未能解决你的问题,请参考以下文章

TreeMap理解

TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?

TreeMap和TreeSet在排序时如何比较元素,Collections工具类中的sort()方法如何比较元素

TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?

如何决定使用 HashMap 还是 TreeMap?

如何决定使用 HashMap 还是 TreeMap?