码迷,mamicode.com
首页 > 其他好文 > 详细

LRU简单实现

时间:2014-11-03 21:02:22      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:ar   java   on   ad   new   as   return   简单   c   

<pre name="code" class="java">import java.util.HashMap;
import java.util.Map;

public class LRUCache {
	private int capacity;
	private int len;

	class Data {
		int key;
		int value;
		Data next;
		Data pre;
	}

	private Map<Integer, Data> dataSet;

	private Data head;
	private Data rail;

	public LRUCache(int capacity) {
		this.capacity = capacity;
		this.len = 0;
		this.head = null;
		this.rail = null;
		this.dataSet = new HashMap<Integer, Data>();
	}

	public int get(int key) {
		if (!dataSet.containsKey(key))
			return -1;
		Data temp = dataSet.get(key);
		if (temp == head) {
			return temp.value;
		} else if (temp == rail) {
			temp.pre.next = null;
			rail = temp.pre;
		} else {
			temp.pre.next = temp.next;
			temp.next.pre = temp.pre;
		}
		temp.next = head;
		temp.pre = null;
		head.pre = temp;
		head = temp;
		return temp.value;

	}

	public void set(int key, int value) {
		if (capacity == 0)
			return;
		if (dataSet.containsKey(key)) {
			Data temp = dataSet.get(key);
			if (temp == head) {
				temp.value = value;
				dataSet.put(key, head);
				return;
			} else if (temp == rail) {
				temp.pre.next = null;
				rail = temp.pre;
			} else {
				temp.pre.next = temp.next;
				temp.next.pre = temp.pre;
			}
			temp.value = value;
			temp.next = head;
			temp.pre = null;
			head.pre = temp;
			head = temp;
			dataSet.put(key, head);
		} else {
			if (len == capacity) {
				dataSet.remove(rail.key);
				if (rail == head)
					head = null;
				else {
					rail.pre.next = null;
					rail = rail.pre;
				}
				len--;
			}

			if (head == null) {
				head = new Data();
				head.key = key;
				head.value = value;
				head.next = null;
				head.pre = null;
				dataSet.put(key, head);
				rail = head;
				len++;
			} else {
				Data temp = new Data();
				temp.key = key;
				temp.value = value;
				temp.next = head;
				temp.pre = null;
				head.pre = temp;
				head = temp;
				dataSet.put(key, head);
				len++;
			}

		}

	}

	public static void main(String args[]) {
		LRUCache l = new LRUCache(2);
		l.set(2, 1);
		l.set(1, 1);
		l.set(2, 3);
		l.set(4, 1);
		System.out.println(l.get(1));
		System.out.println(l.get(2));

	}

}


LRU简单实现

标签:ar   java   on   ad   new   as   return   简单   c   

原文地址:http://blog.csdn.net/youdianmengxiangba/article/details/40746571

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!