对于很多有搜索需求的功能,一般需要展示下最近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实现相关推荐

  1. android 历史搜索布局,《Android APP可能有的东西》之UI篇:流式标签搜索历史

    说在前面 很多APP都有热门排行热门搜索什么的,这个时候可能需要用到标签,也就是流式布局,而还有可能用到的就是搜索历史记录,这种一般都是使用listview展示.但是,相当有可能是反过来的UI展示效果 ...

  2. 实现历史搜索记录和搜索功能

    uniapp实现搜索功能和搜索历史记录 <template><view class="content"><!-- 搜索引擎 这里是模糊查询,后续会加上 ...

  3. 实现搜索框记录搜索历史_三个案例告诉你:“搜索框”该如何设计?

    不管是在2C还是2B产品,"搜索"是产品中最常见且必不可少的功能模块之一.对于用户来说,在众多功能模块和信息层级中如何快速定位到目标,通过输入已知的关键词进行搜索是最便捷的方式,没 ...

  4. 有历史搜索记录的搜索框(百度搜索案例)

    带有历史搜索词条的搜索框 记录一下带有历史搜索词条的搜索框,具体效果类似百度搜索: 点击搜索框 展示历史搜索词条列表: 点击搜索框以外的区域 隐藏历史搜索词条列表: 点击删除除去对应词条. 效果图: ...

  5. Android保存搜索历史

    在我项目中,有这样一个功能实现:先看图 搜索后实时将搜索内容显示到RecyclerView中,可以删除单个历史,也可以清空全部,点击其中一项显示到EditText中.将会涉及到的内容有: Recycl ...

  6. 一个n人搜索的论坛精华帖子→网络(转)

    <script type="text/javascript"> function fastreply(subject) { if($('postform')) { $( ...

  7. GreenDao+SearchView+FlowLoyout实现搜索历史和热门搜索

    之前写过一个静态的搜索页 FlowLayout流式布局实现标签.类似热门搜索这种效果 只是能实现界面效果,但是往往开发中是要把搜索历史缓存到本地数据库中,所以在原基础上添加了数据库功能. 并且把搜索框 ...

  8. HistoryHound for mac(网页浏览记录书签搜索工具)

    HistoryHound Mac版是Mac平台上的一款网页浏览记录书签搜索工具.HistoryHound Mac版是你专属的网络搜索引擎,能够通过关键字快速搜索近期浏览过的网页全文.RSS 订阅源及各 ...

  9. [前端]本地存储搜索历史-localStorage

    搜索框获取焦点后展示搜索历史,搜索历史记录可以存储在前端,如下图所示: 现在使用localStorage存储,可以打开开发者工具-Application-Local Storage(这里使用的是Chr ...

最新文章

  1. GitLab [Webhooks] 实现自动化服务器部署
  2. Windows核心编程 第25章 未处理异常和C ++异常(下)
  3. k8s提交镜像到harbor仓库
  4. UVA690 Pipeline Scheduling 流水线调度
  5. 软件测试面试选择判断提,软件测试面试常考判断题
  6. WTM 构建DotNetCore开源生态,坐而论道不如起而行之
  7. android custom toast,Android自定义Toast
  8. js操作table中tr的顺序,实现上移下移一行的效果
  9. HTML/CSS 知识点
  10. python数据去重的函数_python pandas dataframe 去重函数的具体使用
  11. python中bs4库_python系统学习2——beautiful soup库(bs4库)学习
  12. UVA11577 Letter Frequency【文本】
  13. 读书笔记:高等代数 上册
  14. 数据结构:堆栈的区别
  15. 红linux系统,红帽linux系统下载(iso)
  16. linux桌面隐藏下面任务栏,CentOS 7 隐藏任务栏和顶栏,centos任务栏
  17. 寻找春天amp;nbsp;九宫格日记-2014.04.26
  18. TSE for SketchUp Pro - 建筑行业
  19. Mifare Ultra Light 非接触式IC卡
  20. Android搜索控件SearchView的用法

热门文章

  1. html文档定义层标记是,jsp练习题目201312
  2. 嵌入式Linux多任务编程 进程 管道 命名管道
  3. window电脑查看ssh公钥,以及将自己的公钥添加到Github等类似网站
  4. 解决ipfs 出现Error: can‘t publish while offline: pass `--allow-offline` to override的问题
  5. 解决:Command line is too long. In order to reduce its length classpath file can be used.
  6. VUE 解决:Property or method “deleteFun“ is not defined on the instance but referenced during render.
  7. Mybatis 在 IDEA 中使用 generator 逆向工程生成 pojo,mapper
  8. CentOS6.5 搭建 LNMP (linux + nginx + mysql + php)
  9. Column count doesn't match value count at row 1 原因
  10. 介绍一个对陌生程序快速进行性能瓶颈分析的技巧