为hashmap实现基于时间的队列

时间:2018-06-05 01:07:55

标签: java data-structures hashmap linkedhashmap

我正在开发一个应用程序,我需要为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天的所有条目。

如果您能提供一些建议或建议,将会非常有帮助。提前谢谢。

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。