java - 当值在范围内时返回键

标签 java hashmap

我有一个大型数据集,其中的值是按递增顺序排序的非重叠范围。范围之间有空洞,键(类型为 long)可以分配给多个范围:

[100,300] K1
[310,400] K1
[401,600] K2
[650,1000] K3
...

我需要找到给定值的键。如果值不属于任何范围,我应该返回 0。

我的方法是构建

NavigableMap<Long, Range> map = new TreeMap<>();

然后

map.put(K1, new Range(100,300);
...

这会产生一个相当大的 map ,该 map 按键排序。这不是我想要的,因为我更希望有一个按范围值排序的 map ,以便我可以轻松地进行二进制搜索。我的问题是我不知道如何使用此映射来查找给定值的键。例如,值 101 应返回 K1,500 应返回 K2,301 应返回 0。有什么方法可以使用 NavigableMap 实现我想要的结果,还是我使用了错误的方法?

最佳答案

由于您已声明范围不能重叠但可能有间隙,因此您应该使用 NavigableMap<Range,Long>Range仅使用 hashCode 范围下限的表示和 equals实现。

请注意,我在 NavigableMap 中颠倒了泛型类型的顺序根据您在代码示例中显示的内容。

要搜索一个值,您需要小于搜索键的最大条目(即具有最大下限的条目)。

相反,如果您在 Range 中使用上限对象,您希望最小的条目大于搜索键。

找到合适的Map之后由于可能存在间隙,您必须仔细检查键值是否确实在范围内。

关于java - 当值在范围内时返回键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35666249/

相关文章:

java - 加载 jdbc 驱动程序类时出现随机行为 - 未找到合适的驱动程序

java hashmap键迭代

python - 使用预计算针对特定用例优化 Python 算法

java - 如果所有条目都以链接方式存储在同一索引下,为什么 HashMap 空间会扩展

java - 为什么在尝试使用资源时使用全局资源时不正确

java - Compiling Issues,说是非法启动和期待;在两个构造函数上

java - 关于类变量的向上转换和向下转换有什么区别

java - 在 Java 中过滤/排序大量数据

java - 一个 Hashmap 存储桶可以包含不同的哈希编码对象。如果是的话 hashmap 如何实现 O(1)

c++ - 在 C++ 头文件上检查操作系统时出错