【问题标题】:Android TreeMap blues... Are there alternatives?Android TreeMap blues... 有其他选择吗?
【发布时间】:2015-08-05 20:12:32
【问题描述】:

我一直在尝试在 Android 上使用 TreeMaps,但遇到了以下两个问题:

  1. 旧版 Android 系统上缺少方法:
    当我尝试在我的 Android 2.2.2 测试设备上运行我的应用程序时,它会向我打招呼
    java.lang.NoSuchMethodError: java.util.TreeMap.lowerEntry
    为什么?根据 the documentation,从 API 1 起就应该支持 TreeMap,不是吗?
  2. 在其他设备上的性能绝对糟糕(不正确,请参阅更新!):
    即使在只有 100 个左右元素的非常小的树上,操作也需要几毫秒 (!) 才能完成。哎哟...

基本上,我需要一个提供超快速映射的数据结构,由稀疏整数键“索引”(例如,它包含键 2、100、29392、399391 的条目)。它需要能够快速执行以下操作:

  • 向映射中添加一个与任意整数键关联的条目
  • 查找与某个整数键关联的条目(如果没有找到,则为 null)
  • 从给定键的映射中删除键条目对
  • 遍历地图中的条目
  • 清除地图
  • 返回与小于(或等于)某个数字的最大键对应的条目
  • 返回大于或等于某个数字的最小键对应的条目

所以,基本上我需要 TreeMap 的 getputremovevaluesclearceilingEntryhigherEntry,以及 lowerEntryfloorEntry。 (对于最后两个选项都可以,因为只需将引用键增加或减少 1 即可将一个选项转换为另一个)

是否有任何替代 TreeMap 的替代品,它们表现良好并且可以在所有 Android 设备上使用,或者我可以包含在我的应用中?

更新: 我需要向 Android 或参与构建 TreeMap 的任何人道歉:由于一些愚蠢的逻辑错误,我调用 TreeMap 方法的次数比我想象的要多。性能实际上非常好。我只是被智障... 所以,第 2 点不再是一个问题。离开第1点。对不起,大家...

【问题讨论】:

标签: java android treemap


【解决方案1】:

您可以通过一些技巧来模拟一些NavigableMap 方法。例如,ceilingEntry 大致相当于tailMap(key).entrySet().iterator().next(),但如果没有条目而不是返回 null,它会抛出。 (只需在迭代器上使用 hasNext() 即可解决此问题。)

lowerEntry 更难;您可以这样做 headMap(key).lastKey() 并调用 get 以获取整个条目。 higherEntryfloorEntry 更难,但你说过这不是绝对必要的。

【讨论】:

    【解决方案2】:
    1. 旧版 Android 系统上缺少方法:

    您可以通过将代码从 https://android.googlesource.com/platform/libcore/+/refs/heads/master/luni/src/main/java/java/util/TreeMap.java

    1. 在其他设备上的性能绝对糟糕:

    尝试使用 https://commons.apache.org/proper/commons-collections/javadocs/api-2.1.1/org/apache/commons/collections/FastTreeMap.html

    也许两者兼而有之会让你变得更好。

    HTH

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-26
      • 1970-01-01
      • 2015-08-22
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多