/**
* Created by bdl19 on 2017/3/29.
*/
public class LRUPageFrame {
private static class Node {
Node prev;
Node next;
int pageNum;
Node() {
}
}
private int capacity;
private Node first;// 链表头
private Node last;// 链表尾
public LRUPageFrame(int capacity) {
this.capacity = capacity;
initialize();
//count = 0;
}
/**
* 获取缓存中对象
*
* @param
* @return
*/
public void access(int pageNum) {
int index = checkPageNum(pageNum);
if (index < 0) {
addNewNode(pageNum);
} else {
moveNode(index);
}
}
private void moveNode(int index) {
Node temp = first;
if (index == capacity - 1) {
Node node = last;
last = last.prev;
node.prev.next = null;
node.prev = null;
node.next = first;
first.prev = node;
first = node;
return;
}
if (index == 0) {
return;
}
for (int i = 0; i < index; i++) {
temp = temp.next;
}
temp.prev.next = temp.next;
temp.next.prev = temp.prev;
temp.next = first;
temp.prev = null;
first.prev = temp;
first = temp;
}
private void addNewNode(int pageNum) {
Node node = new Node();
first.prev = node;
node.next = first;
first.prev = node;
node.pageNum = pageNum;
first = node;
last = last.prev;
last.next = null;
}
private int checkPageNum(int num) {
Node node = first;
int index = 0;
while (node != null) {
if (node.pageNum == num) {
return index;
}
index++;
node = node.next;
}
return -1;
}
private void initialize() {
if (capacity <= 0) {
throw new IndexOutOfBoundsException();
}
Node node = new Node();
first = node;
last = node;
for (int i = 0; i < capacity - 1; i++) {
Node n = new Node();
Node temp = last;
last.next = n;
last = n;
last.prev = temp;
}
}
public String toString() {
StringBuilder buffer = new StringBuilder();
Node node = first;
while (node != null) {
buffer.append(node.pageNum);
node = node.next;
if (node != null) {
buffer.append(",");
}
}
return buffer.toString();
}
}