【问题标题】:timerange in javajava中的时间范围
【发布时间】:2012-05-24 05:34:53
【问题描述】:

在 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) 时,它应该能够得到“某个对象”。请建议如何做到这一点?

【问题讨论】:

  • 先获取密钥,用“-”字符分割。然后,测试您的值是否在范围内。
  • @nhahtdh +1 这个问题。如果是这种情况,您将获得多个结果。
  • @nhahtdh 我不明白你的问题?能不能说的详细点?
  • 你能有 3-50 的对象 A,然后是 13-65 的对象 B?在这种情况下,我们有一个从 13 到 50 的重叠,它可以返回 A 和 B。
  • 不,这不会发生!!!谢谢你的好问题..

标签: java


【解决方案1】:

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

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

当然你会保存每个叶子的值(时间跨度/矩形)

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

【讨论】:

  • 为此目的似乎有点矫枉过正。无论如何,你知道这个算法的任何实现吗?
  • @nhahtdh 如果你能找到一个实现,我不会说这是矫枉过正(我不知道 Java 中有一个)。这棵树具有很好的查找复杂性,并且只需要两个双精度 + 对象引用的空间
【解决方案2】:

假设:不重叠的范围。

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

    如果输入为 10,则导出 50 的立即倍数并获得该键的值。

    你可以立即得到 50 的倍数

    1. 采用输入模式,例如输入 90,即 90 % 50 = 40
    2. 用 50 计算第 1 步结果的差异。即 50 - 40 = 10
    3. 将第 2 步的结果添加到输入,即 90 + 10 = 100

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 我想先这样做。但我必须循环所有值。如果没有其他方法,我只会使用它。
      猜你喜欢
      • 1970-01-01
      • 2012-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      • 1970-01-01
      • 1970-01-01
      • 2016-10-09
      相关资源
      最近更新 更多