Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java LRU缓存:linkedhashmap和迭代器实现不工作_Java_Iterator_Linkedhashmap_Lru - Fatal编程技术网

Java LRU缓存:linkedhashmap和迭代器实现不工作

Java LRU缓存:linkedhashmap和迭代器实现不工作,java,iterator,linkedhashmap,lru,Java,Iterator,Linkedhashmap,Lru,我正在尝试使用LinkedHashMap和迭代器创建LRU缓存。它适用于许多测试用例。但是对于一些大型测试用例,它会为get()生成一些不正确的输出 对我来说,代码非常有意义。也许,我遗漏了什么,或者我对linkedHashMap的理解不完整 有人能在实现中找到bug吗?不幸的是,我不能发布测试用例,因为它太大了。您可以尝试在上运行此代码 类LRUCache{ 私有LinkedHashMap地图; 私有int-maxCap; 公共LRUCache(内部容量){ this.map=新建Linked

我正在尝试使用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(键、值); } }
我可能遗漏了一些内容,但您的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);
    }`