3

在 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

4 回答 4

4

我不会使用地图,而是尝试使用R-Tree。R 树是为索引空间数据而创建的树结构。它存储矩形。它通常用于测试一个点(坐标)是否位于另一个几何图形中。这些几何形状由矩形近似,并且存储在树中。

要存储一个矩形(或有关它的信息),您只需要保存左下角和右上角的坐标。在您的情况下,这将是时间跨度的下限和上限。你可以把它想象成坐标的所有y值都是0。然后你可以用你的时间值查询树。

当然,您会保存每片叶子的值(时间跨度/矩形)

在 google 上进行简单的搜索,得到r-tree java了一些有前途的结果。实现自己的 R-tree 并非易事,但如果您了解在插入/删除时重新排列树的原理,它并不会太复杂。在您的一维情况下,它可能会变得更加简单。

于 2012-05-24T05:56:34.653 回答
2

假设:非重叠范围。

您可以将范围的起点和终点存储在 TreeSet 中。起点和终点是分别存储开始时间和结束时间的对象,加上(对)对象的引用。您必须定义比较函数,以便对象按时间排序。

可以通过 TreeSet 的 floor() 或 ceiling() 函数获取对象。

请注意,范围不应重叠,即使在端点处(例如 3-6 和 6-10)

这将为您提供范围插入和查询的日志复杂性。

于 2012-05-24T05:59:26.027 回答
1

如果这是一个非重叠且距离相等的范围,即范围被 50 分割,您可以通过维护最大数字的散列来解决此问题,例如

50 - '一些对象',100 - '一些其他对象',等等。

如果输入为 10,则导出 50 的直接倍数并获取该键的值。

您可以立即达到 50 的倍数

  1. 输入模式为输入 90 即 90 % 50 = 40
  2. 用 50 计算第 1 步结果的差异。即 50 - 40 = 10
  3. 将第 2 步结果添加到输入,即 90 + 10 = 100
于 2012-05-24T05:56:23.827 回答
0

您需要将范围映射到单个键,为什么不使用 rangemanager 对象之类的东西,它返回例如键 1 的最小值和最大值之间的任何值。或者,您可以使用 for 循环将 someobject 作为 1 到 50 之间所有键的值,但这在我看来是一种浪费。

于 2012-05-24T05:42:08.793 回答