public class LFUCache {
HashMap<Integer,KeyValuePair> hashtable = new HashMap<Integer,KeyValuePair>();
int column;
PriorityQueue<KeyValuePair> priorityQueue;
public LFUCache(int capacity) {
column = capacity;
KeyValuePairComparator comparator = new KeyValuePairComparator();
priorityQueue = new PriorityQueue<KeyValuePair>(capacity,comparator);
}
public int get(int key) {
if(!hashtable.containsKey(key)) return -1;
else
{
KeyValuePair valueFromHashtable = hashtable.get(key);
KeyValuePair valueAfterIncreaseFrequencyForPriorityQueue = new KeyValuePair(value.getKey()+1,key);
KeyValuePair valueBeforeIncreaseFrequencyForPriorityQueue = new KeyValuePair(value.getKey(),key);
priorityQueue.remove(valueBeforeIncreaseFrequencyForPriorityQueue);
priorityQueue.add(valueAfterIncreaseFrequencyForPriorityQueue);
return valueFromHashtable.getValue();
}
}
public void set(int key, int value) {
if(priorityQueue.size() >= column)
{
KeyValuePair removed = priorityQueue.poll();
hashtable.remove(removed.getValue());
}
priorityQueue.add(new KeyValuePair(1,key));
hashtable.put(key,new KeyValuePair(1,value));
}
public class KeyValuePair{
private int key;
private int value;
public KeyValuePair(int key,int value)
{
this.key = key;
this.value = value;
}
public int getValue()
{
return this.value;
}
public int getKey()
{
return this.key;
}
public boolean equals(Object k)
{
if( k instanceof KeyValuePair)
{
KeyValuePair c = (KeyValuePair)k;
return key == c.key && value == c.value;
}
else return false;
}
}
public class KeyValuePairComparator implements Comparator<KeyValuePair>
{
public int compare(KeyValuePair k1, KeyValuePair k2)
{
if(k1.getKey()<k2.getKey())
return -1;
else if(k1.getKey()>k2.getKey())
return 1;
else
return 0;
}
}
}
HashMap<Integer,KeyValuePair> hashtable = new HashMap<Integer,KeyValuePair>();
int column;
PriorityQueue<KeyValuePair> priorityQueue;
public LFUCache(int capacity) {
column = capacity;
KeyValuePairComparator comparator = new KeyValuePairComparator();
priorityQueue = new PriorityQueue<KeyValuePair>(capacity,comparator);
}
public int get(int key) {
if(!hashtable.containsKey(key)) return -1;
else
{
KeyValuePair valueFromHashtable = hashtable.get(key);
KeyValuePair valueAfterIncreaseFrequencyForPriorityQueue = new KeyValuePair(value.getKey()+1,key);
KeyValuePair valueBeforeIncreaseFrequencyForPriorityQueue = new KeyValuePair(value.getKey(),key);
priorityQueue.remove(valueBeforeIncreaseFrequencyForPriorityQueue);
priorityQueue.add(valueAfterIncreaseFrequencyForPriorityQueue);
return valueFromHashtable.getValue();
}
}
public void set(int key, int value) {
if(priorityQueue.size() >= column)
{
KeyValuePair removed = priorityQueue.poll();
hashtable.remove(removed.getValue());
}
priorityQueue.add(new KeyValuePair(1,key));
hashtable.put(key,new KeyValuePair(1,value));
}
public class KeyValuePair{
private int key;
private int value;
public KeyValuePair(int key,int value)
{
this.key = key;
this.value = value;
}
public int getValue()
{
return this.value;
}
public int getKey()
{
return this.key;
}
public boolean equals(Object k)
{
if( k instanceof KeyValuePair)
{
KeyValuePair c = (KeyValuePair)k;
return key == c.key && value == c.value;
}
else return false;
}
}
public class KeyValuePairComparator implements Comparator<KeyValuePair>
{
public int compare(KeyValuePair k1, KeyValuePair k2)
{
if(k1.getKey()<k2.getKey())
return -1;
else if(k1.getKey()>k2.getKey())
return 1;
else
return 0;
}
}
}