最多、最少使用优先级算法

 

因为工作的的需要,友好的用户体验是产品成败的关键,今天写了一个最多使用优先级算法已解决目前用户经常使用的检索内容,希望有所帮助。

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;

/**
 * @功能描述:最多、最少使用优先级算法实现
 * @创建人员: jolie
 * @编程人员:
 * @修改人员:
 * @创建时间:2012-2-26 上午11:11:01
 * @修改时间:
 * @备注:以20作为基数处理最多、最少使用优先级算法的实现,
 * @版本:
 * @param <T>
 */
public class MRUAndLRUAlgorithm<T> {

    // 记录请求项
    private static ArrayList list = new ArrayList();

    // 统计最近20次
    private static final int MAX_SIZE=20;

    // 记录每一项请求的次数
    private Map<T, Integer> originalMap=new HashMap<T, Integer>();

    // 请求项 排序序列列表
    private List<Entry<T, Integer>> sortList;

    /**
     * @方法描述:移除最近20次之前第一次请求的信息
     */
    protected void remove() {
        int count=originalMap.get(list.get(0));
        count=count - 1;
        originalMap.remove(list.get(0));
        originalMap.put((T)list.get(0), count);
        list.remove(0);
    }

    /**
     * @方法描述:添加最新请求的内容
     * @param t
     */
    protected void add(T t) {
        if(isFull())
            remove();
        list.add(t);
        countHandler(t);

    }

    /**
     * @方法描述:计数处理
     * @param t 请求的内容值
     */
    protected void countHandler(T t) {
        if(originalMap.containsKey(t)) {
            int count=originalMap.get(t);
            count=count + 1;
            originalMap.remove(t);
            originalMap.put(t, count);
        } else {
            originalMap.put(t, 1);
        }
    }

    /**
     * @方法描述:判断最近是否请求已满
     * @return
     */
    protected boolean isFull() {
        if(MAX_SIZE == list.size()) {
            return true;
        }
        return false;

    }

    /**
     *
     * @方法描述:获取最多请求的内容值
     * @param t
     * @return
     *
     */
    public T mruValue(T t) {
        if(t != null){
        this.add(t);
        }
        sort();
        return this.sortList.get(0).getKey();
    }
   
    /**
     *
     * @方法描述:获取最少请求的内容值
     * @param t
     * @return
     *
     */
    public T lruValue(T t) {
        this.add(t);
        sort();
        return this.sortList.get(sortList.size()-1).getKey();
    }

    protected void sort() {
        Set<Entry<T, Integer>> entrys=originalMap.entrySet();
        if(entrys.isEmpty())
            return;
        sortList = new ArrayList<Entry<T,Integer>>() ;
        Iterator<Entry<T, Integer>> ir=entrys.iterator();
        while(ir.hasNext()) {
            sortList.add(ir.next());
        }
        Collections.sort(sortList, new ValueComparator());
    }

    /**
     *
     * @方法描述:获取排序之后的请求列表值
     * @return
     *
     */
    public List<Entry<T, Integer>> getSortList() {
        return sortList;
    }

    /**
     * @功能描述:降序比较
     */
    class ValueComparator implements Comparator<Entry<T, Integer>> {

        public int compare(Entry<T, Integer> o1, Entry<T, Integer> o2) {

            return o2.getValue() - o1.getValue();
        }

    }
   
   
    public static void main(String[] args){
        MRUAndLRUAlgorithm<String> m = new MRUAndLRUAlgorithm<String>();
        m.add("5");
        m.add("5");
        m.add("3");
        m.add("5");
        m.add("3");
        m.add("2");
        m.add("5");
        m.add("1");
        m.add("5");
       System.out.println(m.mruValue("2")) ;
       
       
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值