-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLRU.java
More file actions
92 lines (68 loc) · 1.99 KB
/
LRU.java
File metadata and controls
92 lines (68 loc) · 1.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import java.util.HashMap;
public class LRU {
class Pair {
Pair before;
Pair after;
int key;
int value;
Pair(int key, int value) {
this.value = value;
}
void addBefore(Pair exist) {
before = exist.before;
before.after = this;
after = exist;
exist.before = this;
}
void remove() {
before.after = after;
after.before = before;
}
}
int size = 0;
Pair header = null;
HashMap<Integer, Pair> map = null;
public LRU(int capacity) {
this.header = new Pair(-1, -1);
header.before = header;
header.after = header;
this.map = new HashMap<Integer, Pair>();
this.size = capacity;
}
public int get(int key) {
if(map.containsKey(key)) {
Pair pair = map.get(key);
adjust(key, pair.value);
return pair.value;
}
return -1;
}
public void set(int key, int value) {
if(!map.containsKey(key)) {
Pair newPair = new Pair(key,value);
newPair.addBefore(header);
map.put(key, newPair);
if(map.size() == size+1) {
Pair oldPair = map.get(header.after.key);
oldPair.remove();
map.remove(oldPair.key);
}
} else {
adjust(key, value);
}
}
public void adjust(int key, int value){
Pair valuePair = map.get(key);
valuePair.value = value;
valuePair.remove();
valuePair.addBefore(header);
}
public static void main(String[] args) {
LRU lru = new LRU(1);
lru.set(2,1);
lru.get(2);
lru.set(3,2);
lru.get(2);
lru.get(3);
}
}