gpt4 book ai didi

java - 为 hashmap 实现基于时间的队列

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:32:42 25 4
gpt4 key购买 nike

我正在开发一个需要固定长度的 HashMap 的应用程序。最初 hashmap 是基于大小限制的,所以我使用了 LinkedHashMap 的 removeEldestEntry 方法来实现这一点。

代码:

public class FixedLengthHashMap<K,V> extends LinkedHashMap<K,V> {

long max_length;

public FixedLengthHashMap(long max_length){

this.max_length = max_length;
}

protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {

return this.size() > max_length;
}
}

但现在我需要根据时间在 HashMap 上存储条目。例如,如果 hashmap 大小为两周,则 hashmap 应该在前 14 天插入条目,当在第 15 天插入新条目时,它应该删除第 1 天的条目。在第 16 天,应删除所有 2nd say 条目,依此类推。

我再次尝试了 removeEldestEntry 方法,如下所示:

public class FixedTimeHashMap<K,V> extends LinkedHashMap<K,V> {
LocalDateTime start;
public FixedTimeHashMap(){
this.start = LocalDateTime.now();
}
protected boolean removeEldestEntry(Map.Entry<K, V> eldest)
{
LocalDateTime current= LocalDateTime.now();
Long diff = ChronoUnit.SECONDS.between(start, current);
if(diff>60*60*24*14)
return true;
else
return false;
}
}

但这只会在第 14 天后为每次插入删除一个条目。在第 15 天插入新条目时,我必须删除第一天的所有条目。

如果能给点意见或建议会很有帮助。提前致谢。

最佳答案

LinkedHashMap 将是一个很好的起点,因为它维护插入顺序。该值需要有一个日期,因此可以将原始值包装在某个带有日期的类中,或者需要一个接口(interface)。

static class Dated<V> {
public final LocalDate date = LocalDate.now();
public final V value;
public Dated(V value) {
this.value = value;
}
}

Map<K, Dated<V>> map = new LinkedHashMap<>();

void insert(K key, V value) {
Dated<V> datedValue = new Dated<>(value);
LocalDate earliest = datedValue.date.minusDays(14);

Iterator<Map.Entry<K, Dated<V>> it = map.entries().iterator();
while (it.hasNext() && it.next().getValue().date.isBefore(earliest)) {
it.remove();
}

map.remove(key); // So at the end of the linked list.
map.put(key, datedValue);
}

remove 确保最新添加的内容被添加到链表的末尾,即使键已经存在也是如此。

因此迭代从最旧的元素开始,然后删除它们。

注意:该问题根据当前时间要求removeEldestOnes。这意味着当没有插入任何内容时,仍然可以删除过去超过 14 天的旧条目。

我的代码也可以用于此,但首先在插入时执行 map.remove 是必不可少的,因此集成了 insert

制作自定义集合类我留给了 OP。

关于java - 为 hashmap 实现基于时间的队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50690691/

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