簡體   English   中英

HashMap只包含最近的條目

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

  • 時間復雜度:對於put和get都是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM