Android TreeMap蓝调......还有其他选择吗?

时间:2015-08-05 20:12:32

标签: java android treemap

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

  1. 在较旧的Android系统上缺少方法:
    当我尝试在Android 2.2.2测试设备上运行我的应用时,它会以java.lang.NoSuchMethodError: java.util.TreeMap.lowerEntry为什么来迎接我?根据 the documentation,自API 1以来应该支持TreeMap,没有?
  2. 在其他设备上绝对糟糕的性能(不是真的,看到更新!):
    即使在只有100个元素左右的非常小的树上,操作也需要毫秒(!)的顺序才能完成。哎哟...
  3. 基本上,我需要一个提供超快速映射的数据结构,由稀疏整数键“索引”(例如,它包含键2,100,29392,399391,...的条目)。它需要能够快速执行以下操作:

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

    所以,基本上我需要TreeMap的getputremovevaluesclearceilingEntryhigherEntry ,以及lowerEntryfloorEntry。 (对于最后两个,任何一个选项都可以,因为可以通过将参考键递增或递减1来转换为另一个选项)

    TreeMap有什么替代品可以很好地运行,并且可以在所有Android设备上使用,或者我可以包含在我的应用程序中吗?

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

2 个答案:

答案 0 :(得分:2)

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

lowerEntry更难;您可以执行headMap(key).lastKey()并在其上调用get以获取整个条目。 higherEntryfloorEntry仍然比较难,但你说的并不是绝对必要的。

答案 1 :(得分:0)

  
      
  1. 旧Android系统上缺少方法:
  2.   

您可以通过将代码复制到您的应用中来自行向后移植 https://android.googlesource.com/platform/libcore/+/refs/heads/master/luni/src/main/java/java/util/TreeMap.java

  
      
  1. 在其他设备上绝对糟糕的表现:
  2.   

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

也许两者都会让你处于更好的状态。

HTHS