Java LRU缓存:linkedhashmap和迭代器实现不工作
我正在尝试使用LinkedHashMap和迭代器创建LRU缓存。它适用于许多测试用例。但是对于一些大型测试用例,它会为get()生成一些不正确的输出 对我来说,代码非常有意义。也许,我遗漏了什么,或者我对linkedHashMap的理解不完整 有人能在实现中找到bug吗?不幸的是,我不能发布测试用例,因为它太大了。您可以尝试在上运行此代码 类LRUCache{ 私有LinkedHashMap地图; 私有int-maxCap; 公共LRUCache(内部容量){ this.map=新建LinkedHashMap(); this.maxCap=容量; } 公共整数获取(整数密钥){ if(地图容器(图例)){ int val=map.get(键); 地图。删除(键); 地图放置(键,val); 返回val; } 返回-1; } 公共void put(int键,int值){ if(maxCap==map.size()){ 整数val=map.get(key); 如果(val!=null){ 地图。删除(键); }否则{ 迭代器itr=map.keySet().Iterator(); if(itr.hasNext()){ itr.next(); itr.remove(); } } } map.put(键、值); } }Java LRU缓存:linkedhashmap和迭代器实现不工作,java,iterator,linkedhashmap,lru,Java,Iterator,Linkedhashmap,Lru,我正在尝试使用LinkedHashMap和迭代器创建LRU缓存。它适用于许多测试用例。但是对于一些大型测试用例,它会为get()生成一些不正确的输出 对我来说,代码非常有意义。也许,我遗漏了什么,或者我对linkedHashMap的理解不完整 有人能在实现中找到bug吗?不幸的是,我不能发布测试用例,因为它太大了。您可以尝试在上运行此代码 类LRUCache{ 私有LinkedHashMap地图; 私有int-maxCap; 公共LRUCache(内部容量){ this.map=新建Linked
我可能遗漏了一些内容,但您的put函数似乎没有删除最近使用最少的项。相反,它似乎从前面删除了第二项(您得到迭代器,调用next()一次,然后删除)。你想要我下面的东西吗 `
public void put(int键,int值){
if(maxCap==map.size()){
整数val=map.get(key);
如果(val!=null){
地图。删除(键);
}否则{
迭代器itr=map.keySet().Iterator();
//调用next,直到得到最后一个值
while(itr.hasNext()){
//不是最后一个值,所以跳过它
itr.next();
}
//删除最后一个值
itr.remove()
}
}
map.put(键、值);
}`
获取LRU缓存的典型方法是使用按访问顺序排列的LinkedHashMap构造函数并重写RemoveedStantry。@我知道LouisWasserman只是想探索更多可能的方法来解决它。另外,RemoveeLDestry提供了一个我不喜欢的抽象,也许我以后会看一下源代码,我发现了。我的解决方案是,当映射未满且密钥已存在于映射中时,不更改最近元素的顺序。我需要为外部if使用else条件。else{Integer val=map.get(key);if(val!=null){map.remove(key);}}我正确使用了迭代器,它是linkedhashmap,因此迭代器将按插入顺序返回键。因此,您应该移除第一个元素,即LRU元素。
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);
}
}
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();
// call next until we have the last value
while (itr.hasNext()) {
// not the last value, so skip it
itr.next();
}
// remove the last value
itr.remove()
}
}
map.put(key, value);
}`