我正在开发一个应用程序,我需要为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天,所有第2个条目的条目应该被删除,依此类推。
我再次尝试了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天插入新条目时删除第1天的所有条目。
如果您能提供一些建议或建议,将会非常有帮助。提前谢谢。
答案 0 :(得分:3)
LinkedHashMap将是一个不错的起点,因为它维持了插入的顺序。该值需要有一个日期,因此可能将原始值包含在某个具有日期的类中,或者需要一个接口。
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。