Не получается переопределить метод в LinkedHashMap

247
12 июня 2017, 20:47

Создаю LRUcache алгоритм

import java.util.LinkedHashMap;
import java.util.Map;
public class LRUAlgoritm<K, V> implements Cache<K, V>{
    private LRUStorage storage; 
    // Конструтор
    public LRUAlgoritm(int capacity) {
        this.storage = new LRUStorage(capacity);
    }
    @Override
    public V get(K key) {
        return storage.get(key);
    }
    @Override
    public V put(K key, V value) {
        return storage.put(key,value);
    }
    private class LRUStorage extends LinkedHashMap<K, V>{
        private final int capacity;
        private LRUStorage (int capacity){
            this.capacity = capacity;
        }
        protected boolean removedEldestEntry(Map.Entry<K, V> eldest){
            return size()>capacity ; 
        }
    }
    @Override
    public String toString() {
        return  "storage= " + storage ;
    }
}

интерфейс cache

public interface Cache <K,V>{
    V get (K key);
    V put (K key, V value);
}

класс раннер

import java.util.LinkedHashMap;
import java.util.Map;
public class Runner {
    public static void main (String[] args){
        LRUAlgoritm<String, String> lruAlgoritm = new LRUAlgoritm(1);
        lruAlgoritm.put("1","1");
        lruAlgoritm.put("2","2");
        lruAlgoritm.put("3","3");
        lruAlgoritm.put("4","4");
        /*  for(Map.Entry<String, String> entry : lruAlgoritm.) {
            String key = entry.getKey();
            String value = entry.getValue()*/
        System.out.println(lruAlgoritm);
    }
}

В Runner необходимо вывести сколько остается в storage. При выводе остаются все которые записываешь.

Результат вывода

storage= {1=1, 2=2, 3=3, 4=4}

а должен быть при

LRUAlgoritm<String, String> lruAlgoritm = new LRUAlgoritm(1);
storage= {4=4}

Отладчиком проверяю, что он делает понять не могу. Но то, что он не проверяет

protected boolean removedEldestEntry(Map.Entry<K, V> eldest)

Это видно, почему, не могу понять(((

Я пытаюсь создать такого типа логику, но почему в моем варианте должен вызываться метод removedEldestEntry не могу сообразить. Что я упускаю?

import java.util.*;
public class LinkedHashMapDemo {
    private static final int MAX_ENTRIES = 2;
    public static void main(String[] args) {
        LinkedHashMap lhm = new LinkedHashMap(MAX_ENTRIES + 1, .75F, false) {
            protected boolean removeEldestEntry(Map.Entry   eldest) {
                return size() > MAX_ENTRIES;
            }
        };
        lhm.put(0, "H");
        lhm.put(1, "E");
        lhm.put(2, "L");
        lhm.put(3, "L");
        lhm.put(4, "O");
        System.out.println("" + lhm) ;
    }
}
Answer 1

Вы в коде нигде не вызываете метод removedEldestEntry.

Ваша основная ошибка в том, что вы не используете аннотацию @Override. Если бы вы её использовали, то получили бы ошибку компиляции. Так как метода removedEldestEntry нет в предке и переопределить его нельзя.

У вас имя метода написано с ошибкой removedEldestEntry вместо removeEldestEntry.

Метод который вам нужен - removeEldestEntry

private class LRUStorage extends LinkedHashMap<K, V> {
    private final int capacity;
    private LRUStorage(int capacity) {
        this.capacity = capacity;
    }
    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        return size() > capacity;
    }
}
READ ALSO
406 Spring MVC Json - не могу вернуть объект

406 Spring MVC Json - не могу вернуть объект

Столкнулся с проблемой, не могу вернуть объект в REST-Controller (метод addUser)Вылазит ошибка HTTP Status 406 -The resource identified by this request is only capable of generating responses with characteristics...

406
Как правильно работать с фрагментами android

Как правильно работать с фрагментами android

Всем привет, сейчас пишу программу с большим количеством фрагментов и с одной активитиСуть в том, что в активити постоянно меняются местами...

285
Получить коды символов в строке

Получить коды символов в строке

Как у переменной типа string по индексу получить коды символов? Понятно что обращаться в цикле к индексуКак именно получить код и какой тип данных...

208
Скачать файл по прямой ссылке

Скачать файл по прямой ссылке

В android приложении по нажатию на кнопку должна начаться загрузка файла по прямой ссылке на загрузку файла( при открытии сразу предлагает сохранить...

632