我有一个大型数据集,其中的值是按递增顺序排序的非重叠范围。范围之间有空洞,键(类型为 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/