在Java中,有没有办法将时间范围存储为Hashmap
中的键?我有一个HashMap
,我存储时间范围。例如:
我输入0-50范围作为键,对于该键,我将其他一些对象存储为值。现在,当我说10时,我应该能够获得该密钥的相应值
0-50之间的任何值都应该得到该对象。
Map map = new HashMap();
map.put(0-50,"some object")
map.put(51-100,"some other object")
现在,当我说map.get(10)
时,它应该能够获得“某个对象”。请建议怎么做?
答案 0 :(得分:4)
我不会使用地图,而是尝试使用R-Tree。 R树是为索引空间数据而创建的树结构。它存储矩形。它通常用于测试点(坐标)是否位于其他几何体内。这些几何形状由矩形近似,并且存储在树中。
要存储矩形(或有关它的信息),您只需要保存左下角和右上角坐标。在您的情况下,这将是时间跨度的下限和上限。您可以想到它,就好像坐标的所有y值都是0.然后您可以使用您的时间值查询树。
当然,您可以保存每个叶子的值(时间跨度/矩形)
在Google上为r-tree java
进行的简单搜索带来了一些有希望的结果。实现自己的R树并非易事,但如果你理解在插入/删除时重新安排树的原则,它就不会太复杂。在你的一维情况下,它可能会变得更简单。
答案 1 :(得分:2)
假设:非重叠范围。
您可以在TreeSet中存储范围的起点和终点。起点和终点是分别存储起始时间和结束时间的对象,加上(引用)对象。您必须定义比较函数,以便按时间对对象进行排序。
您可以使用TreeSet的floor()或ceiling()函数获取对象。
请注意,即使在端点(例如3-6和6-10)
,范围也不应重叠这将为您提供范围插入和查询的日志复杂性。
答案 2 :(得分:1)
您需要将范围映射到单个键,为什么不使用像rangemanager对象这样的东西,例如返回键1的最小值和最大值之间的任何值。另外,你可以使用for循环将someobject作为1到50之间所有键的值,但这在我看来是浪费。
答案 3 :(得分:1)
如果这是一个非重叠且等距离范围,即范围除以50,则可以通过维持最大数字的哈希来解决此问题,例如
50 - '某个对象',100 - '其他一些对象'等等。
如果输入为10,则导出50的立即倍数并获取该键的值。
您可以立即到达50的倍数