• 基于双向链表实现的LRU算法,支持泛型


    先一篇泛型总结得很好的博客:https://segmentfault.com/a/1190000014120746

    用双向链表实现LRU,要求可以指定缓存大小,并且可以存储任意类型的数据。
    (要求用泛型,只需要实现添加方法即可)
    分析:
    1.LRU实现
    操作:
    添加:是否存在?存在-删除-添加到表头; 不存在-看表长?删除末尾添加到表头 or 直接添加到表头
    删除:查找,存在-删除
    数据结构:带表头双链表

    2.任意类型数据-泛型实现

     1 package day3practice;
     2 
     3 
     4 public class GenericParadigm {
     5     public static void main(String args[]){
     6         ListLRUGenne<Integer> lru = new ListLRUGenne<>(6,new NodeGenne());
     7         lru.addNodeLRU(5);
     8         lru.addNodeLRU(4);
     9         lru.addNodeLRU(3);
    10         lru.addNodeLRU(2);
    11         lru.addNodeLRU(1);
    12         lru.printLRU();
    13         lru.addNodeLRU(6);
    14         lru.printLRU();
    15         lru.addNodeLRU(3);
    16         lru.printLRU();
    17         lru.addNodeLRU(7);
    18         lru.printLRU();
    19        //
    20         ListLRUGenne<String> lru2 = new ListLRUGenne<>(6,new NodeGenne());
    21         lru2.addNodeLRU("一护");
    22         lru2.addNodeLRU("鸣人");
    23         lru2.addNodeLRU("路飞");
    24         lru2.addNodeLRU("奇伢");
    25         lru2.addNodeLRU("爱德华");
    26         lru2.printLRU();
    27         lru2.addNodeLRU("兵长");
    28         lru2.printLRU();
    29         lru2.addNodeLRU("奇伢");
    30         lru2.printLRU();
    31         lru2.addNodeLRU("柯南");
    32         lru2.printLRU();
    33 
    34 
    35 }
    36 }
     1 package day3practice;
     2 
     3 
     4 public class ListLRUGenne<T> { //带头结点的单链表,根据题意,所有结点值不同
     5     static int lenLimit;
     6     static NodeGenne headNode = new NodeGenne();
     7     public ListLRUGenne(int lenLimit,NodeGenne headNode){
     8         this.lenLimit = lenLimit;
     9         this.headNode = headNode;
    10     }
    11 
    12     static public int length(){
    13         int length = 0;
    14         NodeGenne scan = headNode;
    15         while(scan.next!=null){
    16             scan=scan.next;
    17             length++;
    18 
    19         }
    20         return  length;
    21     }
    22 
    23     //LRU算法的添加的逻辑:
    24     public void addNodeLRU(T value){
    25         NodeGenne newone = new NodeGenne(value);//先创建一个待加入的新结点
    26         NodeGenne p = headNode;//p是扫描指针
    27 
    28         while(p.value != newone.value&&p.next!=null){
    29             p=p.next;
    30         }
    31         //出循环两种可能,遍历结束没有找到,或者是找到了
    32         if(p.next == null){//遍历完了没有找到
    33             int len= ListLRUGenne.length();
    34             if(len<lenLimit){ //不需要删除操作,直接在头部添加
    35                addNode(headNode,newone);
    36 
    37             }else{
    38                 //先删除最后一个结点
    39                 deleteNode(p);
    40                 //再在列表头部添加
    41                 addNode(headNode,newone);
    42 
    43             }
    44         }else{ //找到了这个结点,删除,在头部添加
    45             deleteNode(p);
    46             addNode(headNode,newone);
    47         }
    48     }
    49 
    50     public void deleteNode(NodeGenne p){
    51         if(p.next == null){
    52             p.pre.next = null; //删除的是尾结点
    53         }
    54         else{//删除的是中间结点
    55             p.pre.next = p.next;
    56             p.next.pre = p.pre;
    57         }
    58     }
    59 
    60 //双链表添加结点
    61     public void addNode(NodeGenne p,NodeGenne newone){
    62         if(p.next == null){ //末尾添加
    63             p.next = newone;
    64             newone.pre = p;
    65         }else{ // 中间添加
    66             newone.next = p.next;
    67             newone.pre = p;
    68             p.next.pre = newone;
    69             p.next = newone;
    70         }
    71 
    72     }
    73 
    74     public void printLRU(){
    75         NodeGenne p = headNode;
    76         if(p.next == null) System.out.println("LRU链表当前无结点");
    77         while(p.next!= null){
    78             p = p.next;
    79             System.out.print(p.value+"  ");
    80         }
    81         System.out.println();
    82     }
    83 }
     1 package day3practice;
     2 
     3 public class NodeGenne <T>{
     4     T value;
     5     NodeGenne next=null;
     6     NodeGenne pre = null;
     7 
     8     public NodeGenne(T value, NodeGenne next,NodeGenne pre){
     9         this.value = value;
    10         this.next = next;
    11         this.pre = pre;
    12     }
    13     public NodeGenne(T value){
    14         this.value = value;
    15     }
    16     public NodeGenne(){
    17     }
    18 
    19 }
    //用双向链表实现LRU,要求可以指定缓存大小,并且可以存储任意类型的数据。
    // (要求用泛型,只需要实现添加方法即可)
    //分析:
    /*1.LRU实现
    操作:
    添加:是否存在?存在-删除-添加到表头; 不存在-看表长?删除末尾添加到表头 or 直接添加到表头
    删除:查找,存在-删除
    数据结构:带表头双链表

    2.任意类型数据-泛型实现
    */
  • 相关阅读:
    js处理select操作总结
    IntelliJ IDEA 下载 安装
    PropertiesConfiguration处理properties
    CentOS操作系统,安装完毕后只能在“命令行模式”下登陆,无法进入“图形化界面”
    java客户端Ip获取
    加载依赖的jar包在命令行编译和运行java文件
    request.getSession(true)和request.getSession(false)的区别
    Spring在web请求中定义编码(org.springframework.web.filter.CharacterEncodingFilter)
    java操作redis
    【http】生命周期和http管道技术 整理中
  • 原文地址:https://www.cnblogs.com/debug-the-heart/p/13308212.html
Copyright © 2020-2023  润新知