【问题标题】:How to use Timestamp in a Map as key如何在地图中使用时间戳作为键
【发布时间】:2019-01-25 22:48:09
【问题描述】:

我正在处理银行应用程序的编码挑战,我需要在过去 60 秒内获取交易数量。 为此,我使用java.sql.Timestamp 作为map 的键,如下所示:

Map<Timestamp, List<Transaction>> transactions1 = new HashMap<>();

这里的值是当时完成的交易列表。 我无法使用 DB。我知道如何遍历地图并获取数据,但为此我需要遍历整个 map,这将非常耗时。

1) 我的问题是Map 是解决这个问题的正确数据结构吗?

2) 如果是这样,我该如何减少它(可能是NavigableMap)?

我要求的不是编码解决方案,而是我应该使用的正确设计/数据结构。

【问题讨论】:

  • 为什么不使用纪元时间戳作为键 1534698909 以便根据键对地图进行排序并获取值
  • 我会说Timestamp 是错误的类。一,它已经过时了,二,它是为与 SQL 数据库一起使用而设计的。考虑Instantjava.time, the modern Java date and time API 的其他类。
  • 如果您只需要交易数量,存储每次的数量就足够了(您不需要实际交易的列表)。我会考虑一个时间和数字对的列表,保持列表按时间排序。然后在最后几分钟内找到最早的计数并将该点的数字相加就足够了。不过,我们对您的要求知之甚少,无法判断这是否是一个好的解决方案,这就是为什么我投票决定以不清楚的方式结束您的问题。

标签: java hashmap timestamp


【解决方案1】:

HashMap 只考虑映射(基于哈希码和相等性)。

这意味着:您必须get()您地图的所有键,以确保您在一定间隔内正确识别这些键。没有捷径,总是对地图中的所有键进行完整的 O(n) 扫描。

因此您是正确的:任何有效的策略都必须允许您搜索该地图(在基于数组/随机访问的方法中),因此实现 NavigableMap 的地图,例如 TreeMap 将是更好的选择。 TreeMaps 也被排序,因此您可以实现某种“二进制搜索”方式来识别最后 n 秒的时间戳。含义:您需要 O(log n) 来确定间隔内的第一个时间戳,然后您只需继续获取 以下 键,直到达到间隔的上限。

除此之外,投资于您自己的某种索引的实现可能会有所帮助。就像一个记住 1/5/n 分钟间隔的第一个时间戳的列表。

含义:最简单的方法是简单地从 HashMap 更改为 TreeMap,并巧妙地寻找区间边界。但是对于“现实世界”场景,您可能必须处理数十万或数百万个条目,这种方法仍然不够。然后,您必须非常仔细地设计一个优化您最重要要求的解决方案。但那是只有你才能做到的事情。

【讨论】:

    【解决方案2】:

    提高性能的一种方法是转储内部 for 循环。通过在HashMap 中添加List&lt;Transaction&gt;,您必须在另一个循环中使用循环来访问Transaction 对象。


    使用,

    HashMap<Long, Transaction> transactions = new HashMap<>();
    

    并使用纳秒作为关键。

    System.nanoTime();
    

    因此,在迭代时,您会立即获得 Transaction 对象。如果你想得到Timestamp

    new Timestamp(nanoseconds/1000000);
    

    【讨论】:

    • 不过,这意味着基于未排序的顺序以 完整 长度迭代地图。当然,您的想法使查找速度更快一些,但这仍然意味着您始终必须始终遍历地图中的 all 条目。因为你必须检查每一个键。这意味着你有 O(n)。每时每刻。将其与对键进行排序进行比较,并且能够进行二进制搜索以确定需要考虑的第一个键!
    • 但可能存在同时有两个事务的情况。在这种情况下,该值将被覆盖。我知道纳秒的可能性较小,但很有可能对吧?
    • @J.Doe 是的,这是可能的。但像 100 万这样非常罕见:1。
    • System.nanotime() 没有给你一个明确定义的时间点,所以你没有获得一个有效的时间戳。 Instant.now() 是一个选项。
    猜你喜欢
    • 2011-11-21
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    相关资源
    最近更新 更多