java中的时间范围

时间:2012-05-24 05:34:53

标签: java

在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)时,它应该能够获得“某个对象”。请建议怎么做?

4 个答案:

答案 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的倍数

  1. 输入模式输入,表示输入90,即90%50 = 40
  2. 计算步骤1的差异结果为50.即50-40 = 10
  3. 将步骤2结果添加到输入,即90 + 10 = 100