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

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

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

【问题讨论】:

  • 如果有的话,我个人会非常惊讶。
  • 您的“初始化值”数据结构是什么?列表?还是HashMap?

标签: java initialization treemap insertion sortedmap


【解决方案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 的匿名实现。丑陋而冗长的罪过,但确实有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多