一个记录最近搜索历史的LRU实现
对于很多有搜索需求的功能,一般需要展示下最近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();}}
}
其实这个实现完全没有任何技术难度,只是尽量将改功能模块化,接口化,方便调用。
一个记录最近搜索历史的LRU实现相关推荐
- android 历史搜索布局,《Android APP可能有的东西》之UI篇:流式标签搜索历史
说在前面 很多APP都有热门排行热门搜索什么的,这个时候可能需要用到标签,也就是流式布局,而还有可能用到的就是搜索历史记录,这种一般都是使用listview展示.但是,相当有可能是反过来的UI展示效果 ...
- 实现历史搜索记录和搜索功能
uniapp实现搜索功能和搜索历史记录 <template><view class="content"><!-- 搜索引擎 这里是模糊查询,后续会加上 ...
- 实现搜索框记录搜索历史_三个案例告诉你:“搜索框”该如何设计?
不管是在2C还是2B产品,"搜索"是产品中最常见且必不可少的功能模块之一.对于用户来说,在众多功能模块和信息层级中如何快速定位到目标,通过输入已知的关键词进行搜索是最便捷的方式,没 ...
- 有历史搜索记录的搜索框(百度搜索案例)
带有历史搜索词条的搜索框 记录一下带有历史搜索词条的搜索框,具体效果类似百度搜索: 点击搜索框 展示历史搜索词条列表: 点击搜索框以外的区域 隐藏历史搜索词条列表: 点击删除除去对应词条. 效果图: ...
- Android保存搜索历史
在我项目中,有这样一个功能实现:先看图 搜索后实时将搜索内容显示到RecyclerView中,可以删除单个历史,也可以清空全部,点击其中一项显示到EditText中.将会涉及到的内容有: Recycl ...
- 一个n人搜索的论坛精华帖子→网络(转)
<script type="text/javascript"> function fastreply(subject) { if($('postform')) { $( ...
- GreenDao+SearchView+FlowLoyout实现搜索历史和热门搜索
之前写过一个静态的搜索页 FlowLayout流式布局实现标签.类似热门搜索这种效果 只是能实现界面效果,但是往往开发中是要把搜索历史缓存到本地数据库中,所以在原基础上添加了数据库功能. 并且把搜索框 ...
- HistoryHound for mac(网页浏览记录书签搜索工具)
HistoryHound Mac版是Mac平台上的一款网页浏览记录书签搜索工具.HistoryHound Mac版是你专属的网络搜索引擎,能够通过关键字快速搜索近期浏览过的网页全文.RSS 订阅源及各 ...
- [前端]本地存储搜索历史-localStorage
搜索框获取焦点后展示搜索历史,搜索历史记录可以存储在前端,如下图所示: 现在使用localStorage存储,可以打开开发者工具-Application-Local Storage(这里使用的是Chr ...
最新文章
- GitLab [Webhooks] 实现自动化服务器部署
- Windows核心编程 第25章 未处理异常和C ++异常(下)
- k8s提交镜像到harbor仓库
- UVA690 Pipeline Scheduling 流水线调度
- 软件测试面试选择判断提,软件测试面试常考判断题
- WTM 构建DotNetCore开源生态,坐而论道不如起而行之
- android custom toast,Android自定义Toast
- js操作table中tr的顺序,实现上移下移一行的效果
- HTML/CSS 知识点
- python数据去重的函数_python pandas dataframe 去重函数的具体使用
- python中bs4库_python系统学习2——beautiful soup库(bs4库)学习
- UVA11577 Letter Frequency【文本】
- 读书笔记:高等代数 上册
- 数据结构:堆栈的区别
- 红linux系统,红帽linux系统下载(iso)
- linux桌面隐藏下面任务栏,CentOS 7 隐藏任务栏和顶栏,centos任务栏
- 寻找春天amp;nbsp;九宫格日记-2014.04.26
- TSE for SketchUp Pro - 建筑行业
- Mifare Ultra Light 非接触式IC卡
- Android搜索控件SearchView的用法
热门文章
- html文档定义层标记是,jsp练习题目201312
- 嵌入式Linux多任务编程 进程 管道 命名管道
- window电脑查看ssh公钥,以及将自己的公钥添加到Github等类似网站
- 解决ipfs 出现Error: can‘t publish while offline: pass `--allow-offline` to override的问题
- 解决:Command line is too long. In order to reduce its length classpath file can be used.
- VUE 解决:Property or method “deleteFun“ is not defined on the instance but referenced during render.
- Mybatis 在 IDEA 中使用 generator 逆向工程生成 pojo,mapper
- CentOS6.5 搭建 LNMP (linux + nginx + mysql + php)
- Column count doesn't match value count at row 1 原因
- 介绍一个对陌生程序快速进行性能瓶颈分析的技巧