LRU

Posted 佛法无边

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LRU相关的知识,希望对你有一定的参考价值。

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;
        }
    }


}

 

以上是关于LRU的主要内容,如果未能解决你的问题,请参考以下文章

面试不再怕,20行Python代码帮你搞懂LRU算法

程序员代码面试指南第二版 156.设计LRU缓存结构

LRU: C++代码实现

LRU: C++代码实现

LRU: C++代码实现

页面置换算法LRU