Я пытаюсь создать кэш LRU, используя LinkedHashMap и итератор. Это работает для многих тестовых случаев. Но для некоторых больших тестовых случаев он выдает несколько неправильных выходных данных для get ().
Для меня код имеет смысл. Возможно, я что-то упустил или, возможно, мое понимание связанного с HashMap неполно.
Может кто-нибудь найти ошибку в реализации? К сожалению, я не могу опубликовать контрольный пример, так как он слишком большой. Вы можете попробовать запустить этот код на https://leetcode.com/problems/lru-cache/.
class LRUCache {
private LinkedHashMap<Integer, Integer> map;
private int maxCap;
public LRUCache(int capacity) {
this.map = new LinkedHashMap<>();
this.maxCap = 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 put(int key, int value) {
if (maxCap == map.size()) {
Integer val = map.get(key);
if (val != null) {
map.remove(key);
} else {
Iterator<Integer> itr = map.keySet().iterator();
if (itr.hasNext()) {
itr.next();
itr.remove();
}
}
}
map.put(key, value);
}
}