最近的热题,就是用LinkedHashMap。
老节点在最前,新节点在最后。
注意get时候也会更新节点。
set时候分两种情况,key在内和不在内。在内时删除旧pair,加入新pair。(不用考虑容量问题)
不在内时,要注意如果容量已经达到,则删除第一个再加入新pair
package Level4;
import java.util.LinkedHashMap;
/**
* LRU Cache
*
Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and set.
get(key) - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.
set(key, value) - Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.
*
*/
public class S149 {
public static void main(String[] args) {
LRUCache c = new LRUCache(1);
c.set(2, 1);
c.set(2, 2);
System.out.println(c.get(2));
}
static class LRUCache {
LinkedHashMap<Integer, Integer> map;
int capacity;
public LRUCache(int capacity) {
map = new LinkedHashMap<Integer, Integer>(capacity);
this.capacity = capacity;
}
public int get(int key) {
if(map.containsKey(key)){
int val = map.get(key);
map.remove(key);
map.put(key, val);
return val;
}
return -1;
}
public void set(int key, int value) {
if(map.containsKey(key)){
map.remove(key);
map.put(key, value);
}else{
if(map.size() == capacity){
int firstKey = map.keySet().iterator().next();
map.remove(firstKey);
}
map.put(key, value);
}
}
}
}