思路
-
每次放值时先判断是否在已经在缓存中
- 如果是,将它左边的元素全部右移一个,然后放置在数组头中,同时更新map中角标
-
如果不是,判断数组是否还有空间
- 有空间,将全部元素右移,然后放置在数组头中,同时更新map中角标
- 如果没有,将角标0到数组长度-1的元素右移,然后放置在数组头中,同时更新map中角标,并在map中删除刚才的元素
关键点
使用map维护数组中值与角标的对应关系,避免每次遍历数组
实现
package com.jiaotd.lru.array;
import java.util.HashMap;
import java.util.Map;
/**
*
*
* @author Administrator
*
*/
public class ArrayLRU<T> {
private int length;
private int pos = 0;
private T[] array1;
private Map<T, Integer> cache;
public ArrayLRU(int length) {
this.length = length;
array1 = (T[]) new Object[length];
cache = new HashMap<T, Integer>(length);
}
public ArrayLRU<T> add(T data) {
Integer index = cache.get(data);
// 之前没有缓存
if (null == index) {
if (pos < length) {
rightMove(pos);
array1[0] = data;
cache.put(data, 0);
pos++;
} else {
rightMove(pos - 1);
cache.remove(array1[length - 1]);
array1[0] = data;
cache.put(data, 0);
}
} else {
// 之前有缓存
rightMove(index);
array1[0] = data;
cache.put(data, 0);
}
return this;
}
public void rightMove(int end) {
for (int i = end - 1; i >= 0; i--) {
array1[i + 1] = array1[i];
cache.put(array1[i + 1], i + 1);
}
}
public void print() {
for (int i = 0; i < pos; i++) {
System.out.print(array1[i] + ",");
}
System.out.println();
}
public static void main(String[] args) {
ArrayLRU<Integer> arrayLRU = new ArrayLRU<Integer>(8);
arrayLRU.add(0).add(1).add(2).add(3).add(4).add(5).add(6).add(7);
arrayLRU.print();
arrayLRU.add(3);
arrayLRU.print();
arrayLRU.add(10);
arrayLRU.print();
arrayLRU.add(5);
arrayLRU.print();
arrayLRU.add(11);
arrayLRU.print();
}
}
结果
7,6,5,4,3,2,1,0,
3,7,6,5,4,2,1,0,
10,3,7,6,5,4,2,1,
5,10,3,7,6,4,2,1,
11,5,10,3,7,6,4,2,
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。