一个记录最近搜索历史的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();
        }
    }
}

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

目录
相关文章
|
存储 自然语言处理 Java
【elasticsearch】记录ES查询数据结果为空的问题(单个字搜索可以,词语搜索为空)
【elasticsearch】记录ES查询数据结果为空的问题(单个字搜索可以,词语搜索为空)
728 0
|
7月前
|
SQL 数据管理 关系型数据库
数据管理DMS操作报错合集之执行列表模糊搜索,无法搜到对应表的记录,是什么原因
数据管理DMS(Data Management Service)是阿里云提供的数据库管理和运维服务,它支持多种数据库类型,包括RDS、PolarDB、MongoDB等。在使用DMS进行数据库操作时,可能会遇到各种报错情况。以下是一些常见的DMS操作报错及其可能的原因与解决措施的合集。
|
5月前
|
存储 缓存 监控
系统设计:在搜索系统实现缓存的策略与思考
【8月更文挑战第26天】在构建高性能的搜索系统时,缓存策略是优化查询响应时间和减轻后端数据库压力的关键手段。随着数据量的激增和用户查询需求的多样化,如何设计并实现一套高效、可扩展且易于维护的缓存机制,成为了技术团队面临的重要挑战。本文将深入探讨搜索系统中缓存策略的设计思路与实践经验,旨在为读者提供一套系统性的解决方案。
63 1
|
7月前
|
机器学习/深度学习 算法 搜索推荐
技术心得记录:常见的比较排序
技术心得记录:常见的比较排序
15 0
|
8月前
|
弹性计算 运维 Shell
自定义命令历史搜索
【4月更文挑战第30天】
37 0
|
8月前
|
Windows
win10搜索功能失效用不了如何解决|
win10搜索功能失效用不了如何解决|
70 0
|
8月前
|
算法 前端开发 索引
前端算法-搜索插入位置
前端算法-搜索插入位置
|
算法 索引
【刷题记录】35. 搜索插入位置
【刷题记录】35. 搜索插入位置
100 0
【刷题记录】35. 搜索插入位置
20天算法刷题计划-搜索插入位置
分析题意,一个排序数组和一个目标值 满足二分查找,同时要求了必须使用时间复杂度为 O(log n) 的算法,也指明了需要使用二分查找的方法 二分查找法的基本思想:将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的数x作比较,如果a[n/2]为需要的数字x则找到,算法终止;如 果x< a[n/2],则我们只要在左半部继续搜索;如果x>a[n/2],则我们只要在右 半部分继续搜索。