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 - 使用 Java 流从现有 map 创建新 map

c++ - 使用 hash_map 和 unordered_map 运行 C++ 程序

java - 使用反射动态保存一个类中的所有字段? ("<FieldName>","<FieldValue>")

java - 如何将面板/框架保存到文件中然后读取它?

java - 哪个哈希码 HashMap 实现用于值检索

java - 带对象键的 HashMap

javascript - 带有索引,键和值的 map 上的每个jquery

Java:为什么同步列表会出现 ConcurrentModificationException?

java - 重复数字

java - 如何知道计算机上的 java 或 java 运行时版本