[英]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.