Last active
January 14, 2020 20:10
-
-
Save ericraio/5f2d382b2991011f74bd489194c4a177 to your computer and use it in GitHub Desktop.
LRU Cache Implementation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.learning; | |
/* package whatever; // don't place package name! */ | |
import java.util.HashMap; | |
class Entry { | |
int value; | |
int key; | |
Entry left; | |
Entry right; | |
} | |
public class LRUCache { | |
HashMap<Integer, Entry> hashmap; | |
Entry start, end; | |
int LRU_SIZE = 4; // Here i am setting 4 to test the LRU cache | |
// implementation, it can make be dynamic | |
public LRUCache() { | |
hashmap = new HashMap<Integer, Entry>(); | |
} | |
public int getEntry(int key) { | |
if (hashmap.containsKey(key)) // Key Already Exist, just update the | |
{ | |
Entry entry = hashmap.get(key); | |
removeNode(entry); | |
addAtTop(entry); | |
return entry.value; | |
} | |
return -1; | |
} | |
public void putEntry(int key, int value) { | |
if (hashmap.containsKey(key)) // Key Already Exist, just update the value and move it to top | |
{ | |
Entry entry = hashmap.get(key); | |
entry.value = value; | |
removeNode(entry); | |
addAtTop(entry); | |
} else { | |
Entry newnode = new Entry(); | |
newnode.left = null; | |
newnode.right = null; | |
newnode.value = value; | |
newnode.key = key; | |
if (hashmap.size() > LRU_SIZE) // We have reached maxium size so need to make room for new element. | |
{ | |
hashmap.remove(end.key); | |
removeNode(end); | |
addAtTop(newnode); | |
} else { | |
addAtTop(newnode); | |
} | |
hashmap.put(key, newnode); | |
} | |
} | |
public void addAtTop(Entry node) { | |
node.right = start; | |
node.left = null; | |
if (start != null) | |
start.left = node; | |
start = node; | |
if (end == null) | |
end = start; | |
} | |
public void removeNode(Entry node) { | |
if (node.left != null) { | |
node.left.right = node.right; | |
} else { | |
start = node.right; | |
} | |
if (node.right != null) { | |
node.right.left = node.left; | |
} else { | |
end = node.left; | |
} | |
} | |
public static void main(String[] args) throws java.lang.Exception { | |
// your code goes here | |
LRUCache lrucache = new LRUCache(); | |
lrucache.putEntry(1, 1); | |
lrucache.putEntry(10, 15); | |
lrucache.putEntry(15, 10); | |
lrucache.putEntry(10, 16); | |
lrucache.putEntry(12, 15); | |
lrucache.putEntry(18, 10); | |
lrucache.putEntry(13, 16); | |
System.out.println(lrucache.getEntry(1)); | |
System.out.println(lrucache.getEntry(10)); | |
System.out.println(lrucache.getEntry(15)); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment