思路
- 采用Java集合中的
LinkedHashMap
数据结构,在HashMap的基础上,使用了前后指针完成双向链表,从而可以实现快速查找,并且可以顺序遍历访问元素。
import java.util.*;
public class Solution {
private int capacity;
private LinkedHashMap<Integer, Integer> cache;
public Solution(int capacity) {
// write code here
this.capacity = capacity;
cache = new LinkedHashMap<>();
}
public int get(int key) {
// write code here
if(!cache.containsKey(key)){
return -1;
}
// 返回前,将其提示为最近使用的
makeRecently(key);
return cache.get(key);
}
public void set(int key, int value) {
// write code here
if(cache.containsKey(key)){ // 已经存在
cache.put(key, value); // 更新数据
makeRecently(key);
return;
}
if(cache.size() == capacity){
// keySet()获取键的集合,iterator()获取键集合的迭代器
Iterator<Integer> iter = cache.keySet().iterator();
int oldKey = iter.next(); // 获取键集合中的第一个元素
cache.remove(oldKey); // 删除第一个键值对
}
cache.put(key, value);
}
private void makeRecently(int key){
int value = cache.get(key);
cache.remove(key); // 删除键值对
cache.put(key, value); // 重新插入到尾部
}
}
/**
* Your Solution object will be instantiated and called as such:
* Solution solution = new Solution(capacity);
* int output = solution.get(key);
* solution.set(key,value);
*/