【发布时间】:2015-08-05 20:12:32
【问题描述】:
我一直在尝试在 Android 上使用 TreeMaps,但遇到了以下两个问题:
- 旧版 Android 系统上缺少方法:
当我尝试在我的 Android 2.2.2 测试设备上运行我的应用程序时,它会向我打招呼java.lang.NoSuchMethodError: java.util.TreeMap.lowerEntry
为什么?根据 the documentation,从 API 1 起就应该支持 TreeMap,不是吗? - 在其他设备上的性能绝对糟糕(不正确,请参阅更新!):
即使在只有 100 个左右元素的非常小的树上,操作也需要几毫秒 (!) 才能完成。哎哟...
基本上,我需要一个提供超快速映射的数据结构,由稀疏整数键“索引”(例如,它包含键 2、100、29392、399391 的条目)。它需要能够快速执行以下操作:
- 向映射中添加一个与任意整数键关联的条目
- 查找与某个整数键关联的条目(如果没有找到,则为 null)
- 从给定键的映射中删除键条目对
- 遍历地图中的条目
- 清除地图
- 返回与小于(或等于)某个数字的最大键对应的条目
- 返回大于或等于某个数字的最小键对应的条目
所以,基本上我需要 TreeMap 的 get、put、remove、values、clear、ceilingEntry 或 higherEntry,以及 lowerEntry 或 floorEntry。 (对于最后两个选项都可以,因为只需将引用键增加或减少 1 即可将一个选项转换为另一个)
是否有任何替代 TreeMap 的替代品,它们表现良好并且可以在所有 Android 设备上使用,或者我可以包含在我的应用中?
更新: 我需要向 Android 或参与构建 TreeMap 的任何人道歉:由于一些愚蠢的逻辑错误,我调用 TreeMap 方法的次数比我想象的要多。性能实际上非常好。我只是被智障... 所以,第 2 点不再是一个问题。离开第1点。对不起,大家...
【问题讨论】:
-
TreeMap,类,已添加到 API 级别 1。lowerEntry(),方法,was added in API Level 9。 -
ceilingEntry可以通过tailMap(key).entrySet().iterator().next()来模拟。 -
@LouisWasserman 伙计!精彩抓拍! :) 那应该工作! (为什么我不能赞成你的评论?)如果你喜欢,你为什么不写一个解释这个想法的快速答案,我会接受它! (请参阅我将在一秒钟内发布的问题的更新...... :))