import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Created by pc on 2017/1/25.
*/
public class LRUCache {
private Object data;
private Date lastTime;
public LRUCache(Object data, Date lastTime) {
this.data = data;
this.lastTime = lastTime;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public Date getLastTime() {
return lastTime;
}
public void setLastTime(Date lastTime) {
this.lastTime = lastTime;
}
@Override
public String toString() {
return "data:"+data.toString()+" lastTime:"+date2Str(lastTime);
}
/**
* 获取系统当前时间
* @return
*/
public static String date2Str(Date date) {
SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
return df.format(date);
}
}
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
/**
* 总结
* Created by pc on 2017/1/25.
*/
public class LRUCacheImpl {
private int total;//设置缓存集合固定大小
private LRUCache lruCache;
private List<LRUCache> list = new ArrayList<>();
public LRUCacheImpl(int total){
this.total = total;
}
private int getListSize(){
return list.size();
}
private void setElement(LRUCache lruCache){
int oldSize = getListSize();
if(oldSize+1>total){//超出则淘汰最近最少访问
//排序 淘汰
sortAsc();//当数据量太大时,这个排序肯定不行 所以按数组这样的方式淘汰是不行的,需要使用链表FIFO节省
list.remove(0);//移除第一个
list.add(lruCache);
}else{
list.add(lruCache);
}
}
private void sortAsc(){
//按时间升序排
list.sort(new Comparator<LRUCache>() {
@Override
public int compare(LRUCache o1, LRUCache o2) {
return o1.getLastTime().compareTo(o2.getLastTime());
}
});
}
public List<LRUCache> getList(){
return list;
}
public static void main(String[] args) {
String pattern = "HH:mm:ss";
LRUCache lruCache1 = new LRUCache("item1",parse("13:15:11",pattern));
LRUCache lruCache2 = new LRUCache("item2",parse("11:10:01",pattern));
LRUCache lruCache3 = new LRUCache("item3",parse("02:04:50",pattern));
LRUCache lruCache4 = new LRUCache("item4",parse("21:35:06",pattern));
LRUCache lruCache5 = new LRUCache("item5",parse("22:37:06",pattern));
LRUCacheImpl impl = new LRUCacheImpl(4);
impl.setElement(lruCache1);
impl.setElement(lruCache2);
impl.setElement(lruCache3);
impl.setElement(lruCache4);
List<LRUCache> list = impl.getList();
System.out.println(list);
impl.setElement(lruCache5);
System.out.println(list);
//[data:item1 lastTime:13:15:11, data:item2 lastTime:11:10:01, data:item3 lastTime:02:04:50, data:item4 lastTime:21:35:06]
//[data:item3 lastTime:02:04:50, data:item2 lastTime:11:10:01, data:item1 lastTime:13:15:11, data:item4 lastTime:21:35:06]
//最后一次访问时间最早的元素首先被淘汰
}
/**
* 使用用户格式提取字符串日期
* @param strDate 日期字符串
* @param pattern 日期格式
* @return
*/
public static Date parse(String strDate, String pattern) {
SimpleDateFormat df = new SimpleDateFormat(pattern);
try {
return df.parse(strDate);
} catch (ParseException e) {
e.printStackTrace();
return null;
}
}
}