LRU cache in Java with Generics and O(1) operations

后端 未结 14 1706
刺人心
刺人心 2020-12-02 07:12

This is a question that comes up a lot in job interviews. The idea is to define a data structure instead of using Java\'s built in LinkedHashMap.

An LRU cache delete

14条回答
  •  不思量自难忘°
    2020-12-02 07:52

    /*Java implementation using Deque and HashMap    */
    
    interface Cache {
        V get(K key) ;
        void set(K key, V value);
    }
    
    class Node {
        K key;
        V value;
    
        public Node (K key, V value) {
            this.key = key;
            this.value = value;
        }
    }
    
    public class LRUCache  implements Cache{
        Deque> dq = new LinkedList<>();
        Map> map = new HashMap<>();
        static int SIZE;
    
        public LRUCache(int size) {
            this.SIZE = size;
        }
    
        public V get(K key) {
            Node result = map.get(key);
            if(result != null) {
                dq.remove(result);
                dq.addFirst(result);
                System.out.println("Get " +key +" : " +result.value);
                return result.value;
            }
            else {
                System.out.println("Cache miss");
                return null;
            }
        }
    
        public void set(K key, V value) {
            System.out.println("Set " +key +" : " +value);
            Node result = map.get(key);
            if(result != null) {
                result.value = value;
                map.put(key, result);
                dq.remove(result);
                dq.addFirst(result);
                System.out.println("Updated frame " +key+" as " + value);
            }
            else {
                if(dq.size() == SIZE) {
                    Node toRemove = dq.removeLast();
                    map.remove(toRemove);
                    System.out.println("Frame removed " +toRemove.key +" : " +toRemove.value);
                }
                Node newNode = new Node(key, value);
                dq.addFirst(newNode);
                map.put(key, newNode);
                System.out.println("Frame added " + key + " : " +value);
            }
        }
    
        public static void main(String[] args) {
            Cache lru = new LRUCache<>(5);
            lru.get(2);
            lru.set(1, 11);
            lru.set(2, 22);
            lru.get(2);
            lru.set(3, 33);
            lru.set(4, 44);
            lru.set(5, 55);
            lru.get(2);
            lru.get(1);
            lru.set(6, 66);
        }
    }
    

提交回复
热议问题