java - 仅包含最新条目的 HashMap

标签 java data-structures collections hashmap

我最近接受了一次面试,面试官要求我创建一个最多有 7 个键/值对的 HashMap。如果添加了第 8 个键/值对,则应删除第一个键/值对并插入第 8 个键/值对以替换它,依此类推。

解决这个问题的好策略是什么?

最佳答案

使用制作数据结构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) put 和 get。
  • 空间复杂度: 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]

关于java - 仅包含最新条目的 HashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57170176/

相关文章:

java - Collections.sort 比较方法违反了它的通用契约

Java创建新节点时出现问题

java - 动态字符串数组java

java - 链表在中间插入

javascript - 用于过滤无模式集合的最快数据结构

algorithm - 有向循环图 (F#) 的数据结构和算法

arrays - F# Array.FindIndex 异常处理

java - 小型 TestNG 应用程序无法正常运行

java - Android加密 "pad block corrupted"异常

java - 错误 org.hibernate.LazyInitializationException - 无法初始化代理 - 无 session