一個記錄最近搜索歷史的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();}}
}

其實這個實現完全沒有任何技術難度,只是盡量將改功能模塊化,接口化,方便調用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450040.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450040.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450040.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python數據可視化2018:數據可視化庫為什么這么多?

本文最初發布于Anaconda開發者博客&#xff0c;經原作者授權由InfoQ中文站翻譯并分享。 在奧斯汀舉行的SciPy 2018年特別會議上&#xff0c;大量開源Python可視化工具的代表分享了他們對Python數據可視化未來的展望。我們看到了Matplotlib、Plotly、VisPy等許多庫的更新。我作為…

Oulipo (KMP出現次數)

The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter e. He was a member of the Oulipo group. A quote from the book: Tout avait Pair normal, mais tout s’affirmait faux. Tout avait Fair normal, d’abord, puis su…

從夫妻吵架中看項目管理

從夫妻吵架中看項目管理&#xff08;很有意思的文章&#xff09; 首先要說明&#xff1a;和老婆吵架無論原因如何&#xff0c;無論結果如何你都是錯的&#xff0c;老婆永遠是對的。但是我不是神仙&#xff0c;偶爾也要吵架。但是如何讓吵架也發揮作用&#xff0c;增進夫妻感情&…

SpringMVC工作原理

大家好&#xff0c;我是IT修真院深圳分院第十一期學員&#xff0c;一枚正直純潔善良的JAVA程序員。 今天給大家分享一下&#xff0c;修真院官網JAVA任務二的一個知識點&#xff1a;SpringMVC工作原理 1、背景介紹 一&#xff1a;背景介紹 JavaWeb經歷的幾個變化&#xff1a; 1:…

Android應用開發—如何解決handler的警告:Handler Class Should be Static or Leaks Occur

轉自android handler的警告Handler Class Should be Static or Leaks Occur 在使用Handler更新UI的時候&#xff0c;我是這樣寫的&#xff1a; public class SampleActivity extends Activity {private final Handler mLeakyHandler new Handler() {Overridepublic void hand…

從遠程(包括ftp,http等協議)地址獲取文件流信息

URL url new URL("ftp://172.18.251.155:8010/recordsImg/2019-01-28/000008_1548649813267.jpg"); MultipartFile multipartFile new MockMultipartFile(fileName,fileName,"", url.openStream());轉載于:https://www.cnblogs.com/baihaojie/p/10331134…

shell 數組

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1&#xff09;定義數組&#xff1a; my_array(1 2 3 4) 也可這樣賦值&#xff1a;my_array[4]愛 讀取&#xff1a; echo ${my_array[2]…

nodejs 實現文件拷貝

通過4中不通的方式實現對一個文件的拷貝 方式一&#xff1a;readFile 異步一次性讀取文件再寫入 //異步形式讀取文件 function copyFile(url){const extName path.extname(url)const fileName path.basename(url)const dirName path.dirname(url)fs.readFile(url, (err, dat…

國家部委對4G調研:未定給中電信聯通發放牌照

一場有關4G牌照發放的論戰正在發酵&#xff0c;矛盾的核心在于&#xff0c;除了中移動外&#xff0c;政府是否也會向中電信和聯通發放TD-LTE(中國主導的4G標準)牌照 記者 王云輝 雍忠瑋 一場圍繞4G的新博弈已經白熱化。 “多個國家部委正在對4G展開全面調研&#xff0c;但最終如…

Luogu4735 最大異或和

題目藍鏈 Description 給你一個序列&#xff0c;你需要支持以下兩個操作&#xff1a; A x: 在序列尾部添加一個整數\(x\)&#xff0c;序列的長度增加\(1\)Q l r x: 詢問操作&#xff0c;你需要找到一個位置\(p \in [l, r]\)&#xff0c;使得&#xff1a;\(x \bigoplus a_p \big…

Spring-jdbc:JdbcTemplate使用簡介

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 為了使 JDBC 更加易于使用,Spring 在 JDBCAPI 上定義了一個抽象層, 以此建立一個JDBC存取框架. 作為 SpringJDBC 框架的核心, JDBC 模板…

Java多線程編程:變量共享分析(Thread)

Java多線程編程&#xff1a;變量共享分析&#xff08;Thread&#xff09; Java 創建線程的兩種方法 此處只簡單講下自己對java多線程變量共享的理解&#xff1a; 按照進程和多線程的原理&#xff0c;同一進程內的多個線程之間的地址空間是共享的&#xff08;除去ThreadLocal&a…

嘉益仕(Litns)帶您讀懂MES系統:選型篇

自從智能制造概念提出以來&#xff0c;制造執行系統MES在國內掀起了新一波的熱潮。眾多企業在技術發展、政策導向和自身需要的推動下&#xff0c;紛紛上馬MES請添加鏈接描述項目。 由此也帶動了MES軟件開發企業的快速發展。一夜之間MES軟件開發企業遍地開花&#xff0c;MES產品…

[WPF]xml序列化以及反序列化數據

代碼 XML序列化工具類 public static class XMLHelper{/// <summary>/// 將對象序列化為指定的文件名/// </summary>/// <typeparam name"T"></typeparam>/// <param name"obj"></param>/// <param name"fil…

多線程的那點兒事

1. 多線程的那點兒事&#xff08;基礎篇&#xff09; 多線程編程是現代軟件技術中很重要的一個環節。要弄懂多線程&#xff0c;這就要牽涉到多進程&#xff1f;當然&#xff0c;要了解到多進程&#xff0c;就要涉及到操作系統。不過大家也不要緊張&#xff0c;聽我慢慢道來。…

Android應用開發—AsyncTask

摘錄自 Android 多線程—–AsyncTask詳解 AsyncTask AsyncTask&#xff1a;異步任務&#xff0c;從字面上來說&#xff0c;就是在我們的UI主線程運行的時候&#xff0c;異步的完成一些操作。AsyncTask允許我們的執行一個異步的任務在后臺。我們可以將耗時的操作放在異步任務當…

std::shared_ptr之deleter的巧妙應用

本文由作者鄒啟文授權網易云社區發布。std::shared_ptr一次創建&#xff0c;多處共享&#xff0c;通過引用計數控制生命周期。 實例 在郵箱大師PC版中&#xff0c;我們在實現搜索時&#xff0c;大致思路是這樣的&#xff1a; 每一個賬號都有一個SearchFlow&#xff0c;搜索開始…

js - 執行上下文和作用域以及閉包

首先&#xff0c;咱們通常被"執行上下文"&#xff0c;"執行上下文環境"&#xff0c;"上下文環境"&#xff0c;"執行上下文棧"這些名詞搞混。那我們一一來揭秘這些名字的含義。 這一塊一直比較晦澀難懂&#xff0c;還是需要仔細去斟酌斟…

Spring之JDBCTemplate

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、Spring對不同的持久化支持&#xff1a; Spring為各種支持的持久化技術&#xff0c;都提供了簡單操作的模板和回調 ORM持久化技術模…