![](/img/trans.png)
[英]Dictionary or similar data structure that only stores the most recent n entries?
[英]HashMap with only most recent entries
我最近接受了采访,采访员要求我创建一个最多有7个键/值对的HashMap
。 如果添加了第8个键/值对,则应删除第一个键/值对,插入第八个键/值对以替换它,等等。
什么是解决这个问题的好策略?
Java标准库包含一个名为LinkedHashMap
的类型,它或多或少地执行了您希望在此处执行的操作。 它就像一个常规的HashMap
除了它跟踪插入元素的顺序。 如果您定义一个子类并覆盖removeEldestEntry
受保护的方法,那么LinkedHashMap
将自动驱逐旧元素,并在您希望的任何计划中用新元素替换它们。
另一方面,如果你想自己构建这样的东西,你可能正在寻找像哈希表这样的东西,它具有穿过元素的双链表。 每当插入元素时,都会将其附加到链接列表,然后,如果元素太多,则删除第一个元素。 我将详细介绍如何删除等等。
话虽如此,上述策略最适合相当大的地图(例如,一百个键/值对或更多)。 如果你只需要存储七个键/值对,那么几乎可以肯定的是,只需将所有内容放入一个未排序的数组中,然后通过检查每个元素来迭代元素以找到你正在寻找的那个。 :-)
最后,有趣的事实是:您正在设计的内容有时称为LRU cache
。 它们广泛用于硬件和软件中。
使用LinkedHashMap创建数据结构并覆盖removeEldestEntry,如下所示:
import java.util.LinkedHashMap;
class CustomHashMap extends LinkedHashMap<Integer, Integer> {
private int capacity;
public CustomHashMap(int capacity) {
super(capacity, 0.75F, true);
this.capacity = capacity;
}
public int get(int key) {
return super.getOrDefault(key, -1);
}
public void put(int key, int value) {
super.put(key, value);
}
@Override
protected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest) {
return size() > capacity;
}
}
或者,如果您不允许使用标准库,或者您使用的语言不具有Java / Python之类的有序字典结构,则可以使用Hashtable
+和DoubleEndedLinkedList
,您可以自己定义并实现相同的功能或使用Deque
:
O(1)
。 O(capacity)
。 虽然你必须编写更多代码。
根据@Holger的请求的通用版本 :
import java.util.LinkedHashMap;
import java.util.Map;
class CustomHashMap<K, V> extends LinkedHashMap<K, V> {
private int capacity;
public CustomHashMap(int capacity) {
super(capacity, 0.75F, true);
this.capacity = capacity;
}
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > capacity;
}
}
用法示例:
class Main {
public static void main(String[] args) {
CustomHashMap map = new CustomHashMap(3);
map.put(1, null);
map.put(2, null);
map.put(3, null);
map.put(4, null);
System.out.println(map.keySet());
}
}
输出:
[2, 3, 4]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.