https://blog.csdn.net/luoweifu/article/details/8297084
参考上方博主的思路,使用双向链表和hashMap来实现,但是觉得hashMap来回改,效率也没提升多少吧
整个输入以及过程可以参考上方博主给的思路,理解了!
如输入以下序列时:4,7,0,7,1,0,1,2,1,2,6
结果为:
4
4 7
4 7 0
4 0 7
4 0 7 1
4 7 1 0
4 7 0 1
4 7 0 1 2
4 7 0 2 1
4 7 0 1 2
7 0 1 2 6
import java.util.HashMap; import java.util.LinkedList; public class LRU { public static void main(String[] args) { LRU lru = new LRU(); int[] item=new int[]{4,7,0,7,1,0,1,2,1,2,6}; for (int i = 0; i < item.length; i++) { lru.push(item[i]); } lru.showList(); } //容量 private int N=5; //存放数组 private LinkedList<Object> lists=new LinkedList<>(); private HashMap<Object,Integer> hashMap=new HashMap<>(); private boolean isFull(){ return lists.size()>=N; } //返回插入位置索引 public int push(Object obj){ if(hashMap.containsKey(obj)){ int index=hashMap.get(obj);//找到这个key的索引 for(int i=index;i<lists.size()-1;i++){ lists.set(i,lists.get(i+1)); hashMap.put(lists.get(i),hashMap.get(lists.get(i))-1); } lists.set(lists.size()-1,obj); hashMap.put(obj,lists.size()-1); } else { if(!isFull()){ hashMap.put(obj,lists.size());//放入索引,因为要在现在的list上追加,索引为lists.size()-1+1 lists.add(obj); } else { Object first=lists.getFirst(); hashMap.remove(first); lists.removeFirst(); lists.add(obj); for (int i = 0; i < lists.size(); i++) { hashMap.put(lists.get(i),i); } } } return hashMap.get(obj); } public void showList(){ for (int i = 0; i < lists.size(); i++) { System.out.print(lists.get(i)+" "); } } }
原文:https://www.cnblogs.com/ningxinjie/p/13636956.html