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

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

目录
相关文章
若依框架----登录界面美化
若依框架----登录界面美化
1452 0
|
存储 SQL 监控
全链路压测:影子库与影子表之争
在生产环境实施全链路压测的过程中,针对上文谈到的两种方案,又面临着数据隔离方案的选择问题,本文首先针对影子库、影子表两种方案进行介绍和对比,然后针对常见的场景,给出方案的选择建议。
5556 107
全链路压测:影子库与影子表之争
|
负载均衡
《从零开始手写RPC框架》电子书升级啦!
大家好,我是冰河~~ 今天跟大家正式宣布一个好消息,冰河的《从零开始手写RPC框架(基础篇)》电子书,升级啦! 这本电子书中包含哪些内容呢?小伙伴们可以直接拉到文末查看获取方式,也可以先听冰河吹一吹这本电子书的内容。
632 0
《从零开始手写RPC框架》电子书升级啦!
网络数据包收发流程(三):e1000网卡和DMA
一、硬件布局每个网卡(MAC)都有自己的专用DMA Engine,如上图的 TSEC 和 e1000 网卡intel82546。上图中的红色线就是以太网数据流,DMA与DDR打交道需要其他模块的协助,如TSEC,PCI controller以太网数据在 TSECDDR  PCI_Co...
5918 1
|
Java 关系型数据库 MySQL
maven项目中添加MySql依赖失败(以及maven的安装到maven项目的使用过程)
maven项目中添加MySql依赖失败(以及maven的安装到maven项目的使用过程)
4083 1
maven项目中添加MySql依赖失败(以及maven的安装到maven项目的使用过程)
|
存储 安全 芯片
U盘在电脑上读不出来怎么办?6个方法帮你修复U盘
平时在存储和传输数据的时候,我们经常会使用到U盘这种存储设备。U盘容量大,使用方便且便于携带,很受欢迎。 然而,在日常使用中,有时候会遇到U盘插入电脑后无法被电脑识别或读取的情况。这会让人感到困扰,因为我们无法访问U盘里的文件。遇到这种情况该怎么办呢?今天的内容会讨论一下U盘无法读取的症状、分析一下常见原因并且提供6个方法帮你修复U盘。
|
敏捷开发 安全 测试技术
PingCode
【10月更文挑战第19天】PingCode
717 62
|
SQL 存储 缓存
SQL Server 内存占用较高 - 清除缓存 或 设置内存最大占用值
SQL Server 内存占用较高 - 清除缓存 或 设置内存最大占用值
1012 0
|
存储 算法 安全
SHA-1被攻破了吗? PostgreSQL SCRAM-SHA-256 安全认证机制解救你来了
标签 PostgreSQL , 认证方法 , SCRAM-SHA-256 , scram , scram-sha-256-plus , SASL , Simple Authentication and Security Layer 背景 PostgreSQL的很多设计非常的工业化,比如开放了许多扩展接口(类型、操作符、索引、扫描、采样、数据库编程语言等)。
7236 0
|
Java 关系型数据库 测试技术
基于 SpringBoot+Vue+Java 的财务管理系统(附源码,数据库,教程)
基于 SpringBoot+Vue+Java 的财务管理系统(附源码,数据库,教程)