gpt4 book ai didi

java - 及时查找添加到 Guava LinkedHashMultimap/HashMultiMap 的第一个和最后一个元素

转载 作者:行者123 更新时间:2023-12-02 12:59:00 26 4
gpt4 key购买 nike

我每分钟都有一个带有时间戳的统计数据流(每分钟的任意数量的统计数据)。这只是一个持续的统计数据流,不允许更改之前的数据。这里也不存在并发问题。所以适当的数据结构是 map<timestamp,list<stats>> 。然而,这个映射只需要保留最后 30 分钟的数据,所以它也应该踢出第一个元素并写入新的元素(循环缓冲区)。有人告诉我 Guava HashMultimap 是一个很好的选择。但我不知道如何使用它并找到 map 的第一个和最后一个元素以及如何删除最后一个元素。当我查看LinkedHashMultiMap时我没有看到任何查找第一个或最后一个元素的方法。我感谢任何帮助。

最佳答案

您可以采取几种方法。我将解释并展示两者的示例。我不会解决同步问题,如果有必要请告诉我,我可以添加详细信息以确保 Multimap 代码是线程安全的。这涉及在访问多重映射的 View 时正确同步多重映射并将其包装在同步包装器中。更多详情还可查看here .

  1. 使用多重贴图
  2. 使用 Guava 的 Cache

对于 Multimap 方法,我建议您使用 LinkedListMultimap 。它将确保您的键和值都是有序的(因为您最初声明了 Map<Timestamp, List<Stat>> 。LinkedHashMultimap 将保留顺序,但会删除重复的统计信息。如果这不是问题,那么您可以使用 LinkedHashMultimap 。

要获取第一个键值,可以使用迭代器或者使用Guava的Iterables getFirst(Iteratable, defaultValue) 实用方法。要获取最后一个键值,可以使用 Iterables getLast(Iteratable, defaultValue) 方法。如果您的目标只是删除超过 30 分钟的值,您可以忽略 Iterables,只使用 Multimap 键的迭代器。

LinkedHashMultimap<Date, Stat> stats = LinkedHashMultimap.create();

//Every minute
stats.putAll(new Date(), newStats);

//To get the first key inserted into the map
Date first = Iterables.getFirst(stats.keys(), null);
//Remove the first entry
stats.remove(first);

//To get the last key inserted into the map
Date last = Iterables.getLast(stats.keys(), null);
//Remove the last entry
stats.remove(last);

//Without using Iterables.
Set<Date> keys = stats.keys();
if (!keys.isEmpty()) {
keys.iterator().next().remove();
}

多重 map 方法要求您手动管理删除旧统计数据。在这方面,一个稍微简单的方法是使用 Guava 的缓存。但请注意,这不会维护任何类型的顺序,并且会更难以获取一段时间的值,因为您不会获得插入统计信息的确切时间戳。您需要使用 .hashCode() 创建自己的自定义 Date 类。和.equals(Object)适合您需求的方法。这可能比其值(value)更多的工作。

Cache<CustomDate, List<Stat>> cache = CacheBuilder.newBuilder()
.expireAfterWrite(30, TimeUnit.MINUTES)
.build();

cache.put(new CustomDate(), stats);
List<Stat> statsForTime = cache.get(new CustomDate(/*appropriate initialization*/));

关于java - 及时查找添加到 Guava LinkedHashMultimap/HashMultiMap 的第一个和最后一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44338781/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com