使用java映射进行范围搜索
我有一个用例,如果一个数字在0-10之间,它应该返回0,如果它在11-20之间,它应该返回1,以此类推
0 => 0-3, (0 and 3 are inclusive)
1 => 4-15, (4 and 15 are inclusive)
2 => 16-40, (16 and 40 are inclusive)
3 => 41-88, (41 and 88 are inclusive)
5 => 89-300 (89 and 300 are inclusive)
我在考虑如何实现java映射,但它不允许范围搜索
我对这样的东西感兴趣,我有一个函数
int foo() {
}
如果foo返回5,因为它位于0到10之间,所以我将使用0,如果foo返回25,则使用2
有什么想法吗
编辑:实际上,范围没有0-10、11-20那么简单。我希望能够进行范围搜索。很抱歉搞混了。根据我添加的正确示例的查询,数字是连续的
# 1 楼答案
我认为你想要的是类似于
foo()/10
的东西,但这会让你的范围稍微偏离你所要求的范围。如果“地图”中的每个项目不遵循简单的模式,您总是可以对它们的两个端点进行比较# 2 楼答案
我可以想出一些可能的解决方案,解决范围不一致且存在“漏洞”的更一般问题。最简单的是:
floorEntry(key)
进行查找。这应该是更少的时间效率(O(log(N)查找),但更节省空间李>这里有一个使用NavigableMap的解决方案,允许在映射中出现“洞”
另一方面,如果没有“孔”,则解决方案更简单:
# 3 楼答案
在更一般的情况下,不能用算术来解决,您可以创建一个带有适当比较器的树形图。为边界值添加映射,然后使用ceilingEntry或floorEntry查找适当的匹配项
# 4 楼答案
基于John Kugelman's answer,我需要类似的东西来进行日期范围搜索,该搜索包含与日期范围相关联的数据。。。下面是我如何应用它的一个示例。“日期”将是您的键,“范围数据”将是关联的数据
结果
# 5 楼答案
我认为最简单的解决方案是将范围上限的映射添加到范围映射到的值,然后继续增加数字(映射中的键),直到达到映射(即数字所在范围的上限)
另一种方法是使用范围内的所有条目填充映射,并为每个条目添加映射
哪一个更有效取决于您可能需要重复请求某个范围内的所有数字(使用后一种解决方案),还是只请求其中一些数字几次(使用第一种)
# 6 楼答案
伪代码:
new int[] {0, 3, 5, 15, 100, 300}
李>10
的插入点将是3
,将其置于5
和15
之间,因此它属于第二个范围李>