Android TreeMap 蓝调...有其他选择吗?
Android TreeMap blues... Are there alternatives?
我一直在尝试在 Android 和 运行 上使用 TreeMaps 解决以下两个问题:
- 旧 Android 系统上缺少方法:
当我尝试 运行 我的应用程序在我的 Android 2.2.2 测试设备上时,它向我打招呼
java.lang.NoSuchMethodError: java.util.TreeMap.lowerEntry
为什么?根据
the documentation,TreeMap 应该支持,因为 API 1,不?
- 在其他设备上绝对糟糕的性能(不正确,查看更新!):
即使在只有 100 个左右元素的非常小的树上,操作也需要毫秒 (!)完全的。哎哟...
基本上,我需要一个数据结构来提供超快速映射,"indexed" 通过稀疏整数键(例如,它包含键 2、100、29392、399391 等的条目) .它需要能够快速执行以下操作:
- 向与任意整数键关联的映射添加条目
- 查找与某个整数键关联的条目(如果 none 找到则为空)
- 从给定密钥的映射中删除密钥条目对
- 迭代映射中的条目
- 清除地图
- Return小于(或等于)某个数的最大key对应的entry
- Return大于等于某个数的最小key对应的entry
所以,基本上我需要 TreeMap 的 get
、put
、remove
、values
、clear
、ceilingEntry
或 higherEntry
,以及 lowerEntry
或 floorEntry
。 (对于最后两个选项都可以,因为只需将参考键递增或递减 1 即可将一个选项转换为另一个选项)
是否有任何替代 TreeMap 的性能良好并且可以在所有 Android 设备上使用或者我可以包含在我的应用程序中的替代方法?
更新:
我需要向 Android 或参与构建 TreeMap 的任何人道歉:由于一些愚蠢的逻辑错误,我调用 TreeMap 方法的次数比我想象的要多。性能实际上非常好。我只是被智障了……所以,第 2 点不再是一个问题。离开第1点。对不起,大家...
- Missing methods on older Android systems:
您可以通过将代码复制到您的应用中来自行向后移植
https://android.googlesource.com/platform/libcore/+/refs/heads/master/luni/src/main/java/java/util/TreeMap.java
- Absolutely abysmal performance on other devices:
也许两者兼而有之会让你的身材更好。
HTH
您可以通过一些技巧来模拟某些 NavigableMap
方法。例如,ceilingEntry
大约等同于 tailMap(key).entrySet().iterator().next()
,但如果没有条目它会抛出而不是返回 null。 (只需在迭代器上使用 hasNext()
即可解决该问题。)
lowerEntry
更难;您可以执行 headMap(key).lastKey()
并对其调用 get
以获得整个条目。 higherEntry
和 floorEntry
更难,但你说过这不是绝对必要的。
我一直在尝试在 Android 和 运行 上使用 TreeMaps 解决以下两个问题:
- 旧 Android 系统上缺少方法:
当我尝试 运行 我的应用程序在我的 Android 2.2.2 测试设备上时,它向我打招呼java.lang.NoSuchMethodError: java.util.TreeMap.lowerEntry
为什么?根据 the documentation,TreeMap 应该支持,因为 API 1,不? - 在其他设备上绝对糟糕的性能(不正确,查看更新!):
即使在只有 100 个左右元素的非常小的树上,操作也需要毫秒 (!)完全的。哎哟...
基本上,我需要一个数据结构来提供超快速映射,"indexed" 通过稀疏整数键(例如,它包含键 2、100、29392、399391 等的条目) .它需要能够快速执行以下操作:
- 向与任意整数键关联的映射添加条目
- 查找与某个整数键关联的条目(如果 none 找到则为空)
- 从给定密钥的映射中删除密钥条目对
- 迭代映射中的条目
- 清除地图
- Return小于(或等于)某个数的最大key对应的entry
- Return大于等于某个数的最小key对应的entry
所以,基本上我需要 TreeMap 的 get
、put
、remove
、values
、clear
、ceilingEntry
或 higherEntry
,以及 lowerEntry
或 floorEntry
。 (对于最后两个选项都可以,因为只需将参考键递增或递减 1 即可将一个选项转换为另一个选项)
是否有任何替代 TreeMap 的性能良好并且可以在所有 Android 设备上使用或者我可以包含在我的应用程序中的替代方法?
更新: 我需要向 Android 或参与构建 TreeMap 的任何人道歉:由于一些愚蠢的逻辑错误,我调用 TreeMap 方法的次数比我想象的要多。性能实际上非常好。我只是被智障了……所以,第 2 点不再是一个问题。离开第1点。对不起,大家...
- Missing methods on older Android systems:
您可以通过将代码复制到您的应用中来自行向后移植 https://android.googlesource.com/platform/libcore/+/refs/heads/master/luni/src/main/java/java/util/TreeMap.java
- Absolutely abysmal performance on other devices:
也许两者兼而有之会让你的身材更好。
HTH
您可以通过一些技巧来模拟某些 NavigableMap
方法。例如,ceilingEntry
大约等同于 tailMap(key).entrySet().iterator().next()
,但如果没有条目它会抛出而不是返回 null。 (只需在迭代器上使用 hasNext()
即可解决该问题。)
lowerEntry
更难;您可以执行 headMap(key).lastKey()
并对其调用 get
以获得整个条目。 higherEntry
和 floorEntry
更难,但你说过这不是绝对必要的。