一个记录最近搜索历史的LRU实现

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/voidreturn/article/details/79166572 对于很多有搜索需求的功能,一般需要展示下最近n次的历史搜索记录,主要有以下几个功能点:最近搜索条目放在最前面,最早的搜索记录放在最后。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/voidreturn/article/details/79166572
对于很多有搜索需求的功能,一般需要展示下最近n次的历史搜索记录,主要有以下几个功能点:
  • 最近搜索条目放在最前面,最早的搜索记录放在最后。
  • 只记录最近n条数据,如果超过n条搜索记录,删除搜索时间最久远的记录。
  • 没有重复的搜索项,如果新搜索的关键字已存在,则将该关键字提到最前面,删除原位置关键字。
  • 可方便的持久化,并可以通过读取持久化数据,恢复原纪录历史。

基于以上这些条件,不难看出这就是一个无重复数据的LRU stack,本来以为java集合会有支持该需求的实现,尝试了stack等集合类型,发现不是很好弄,最后还是采用list做一个吧,简单方便。

Android版:
public class SearchHistoryUtil {
    private LruStackUtil mLruStack = null;

    public SearchHistoryUtil(int maxSize) {
        this.mLruStack = new LruStackUtil(maxSize);
    }

    public void updateSearchHistorys(Context context, String keyWord) {
        SharedPreferences sharedPreferences = context.getSharedPreferences("music_search_history",
                Activity.MODE_PRIVATE);
        String mKeys = sharedPreferences.getString("keys", "");
        mLruStack.reset();
        SharedPreferences.Editor editor = sharedPreferences.edit();

        String[] tmpHistory = mKeys.split(",");
        for (String i : tmpHistory) {
            mLruStack.push(i);
        }
        mLruStack.pushHead(keyWord);
        editor.putString("keys", mLruStack.getAll());
        editor.apply();
    }

    public static String getAllHistorys(Context context) {
        SharedPreferences sharedPreferences= context.getSharedPreferences("music_search_history",
                Activity.MODE_PRIVATE);
        String mKeys = sharedPreferences.getString("keys", "");
        return mKeys;
    }

    public static void clearAll(Context context) {
        SharedPreferences sharedPreferences = context.getSharedPreferences("music_search_history",
                Activity.MODE_PRIVATE);

        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.clear();
        editor.apply();
    }
}

public class LruStackUtil {
    ArrayList<String> stack = null;
    private int size = 0;

    public LruStackUtil(int size) {
        this.stack = new ArrayList<String>();
        this.size = size;
    }

    public void pushHead(String keyWord) {
        if (stack.remove(keyWord)) {
            stack.add(0, keyWord);
            return;
        }

        if (stack.size() > this.size - 1) {
            stack.remove(stack.size() - 1);
            stack.add(0, keyWord);
        } else {
            stack.add(0, keyWord);
        }
    }

    public void push(String keyWord) {
        if (stack.contains(keyWord)){
            return;
        }

        if (stack.size() > this.size - 1) {
            return;
        } else {
            stack.add(keyWord);
        }
    }

    public String getAll() {
        StringBuilder str = new StringBuilder();
        for (int i = 0; i < stack.size(); i++) {
            str.append(stack.get(i) + ",");
        }

        return str.toString();
    }

    public void reset() {
        if (stack != null) {
            stack.clear();
        }
    }
}

其实这个实现完全没有任何技术难度,只是尽量将改功能模块化,接口化,方便调用。

目录
相关文章
|
6月前
|
存储 自然语言处理 Java
【elasticsearch】记录ES查询数据结果为空的问题(单个字搜索可以,词语搜索为空)
【elasticsearch】记录ES查询数据结果为空的问题(单个字搜索可以,词语搜索为空)
274 0
|
3月前
|
算法 前端开发 索引
前端算法-搜索插入位置
前端算法-搜索插入位置
|
移动开发 算法
秒懂算法 | A*搜索
本篇内容包括了A*搜索算法的原理精解以及2个例题。
217 1
秒懂算法 | A*搜索
|
缓存 NoSQL 搜索推荐
TairSearch:msearch实现索引分片搜索
TairSearch是Tair自主研发的高性能、低延时、基于内存的实时搜索引擎。在Tair中以key作为最小粒度的路由数据单位,TairSearch一个key对应的是搜索中的一个schema。如果一个schema中的文档数过多,则会导致在Tair中存在一个超大key,当文档数占用的总内存超过单节点的内存限制时,业务会出现oom等错误告警。众所周知,当缓存服务的单节点内存容量受限时,可通过变配成集群
253 0
TairSearch:msearch实现索引分片搜索
|
算法 索引
怒刷力扣(搜索插入位置)
二分法是一个家喻户晓的算法了,是查找算法里面的最简单的算法之一吧,如果你还不会,那必须得来看看,学习学习了。
84 0
怒刷力扣(搜索插入位置)
|
算法 索引
【刷题记录】35. 搜索插入位置
【刷题记录】35. 搜索插入位置
73 0
【刷题记录】35. 搜索插入位置
|
JavaScript 前端开发 算法
|
存储 小程序
小程序实现搜索历史记录,去重搜索字段以及限制展示字段数量
小程序实现搜索历史记录,去重搜索字段以及限制展示字段数量
1345 0
|
数据采集 机器学习/深度学习 编解码
神马搜索如何提升搜索的时效性?
什么是搜索的时效性?有哪些特征?如何优化?本文分享神马搜索在搜索排序时效性问题上的实践和探索,从基础特征优化开始,通过标注数据进行排序和召回模型优化,以及时效性排序的召回体系和收录体系。较长,同学们可收藏后再看。
2682 0
神马搜索如何提升搜索的时效性?