对于很多有搜索需求的功能,一般需要展示下最近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();}}
}
其实这个实现完全没有任何技术难度,只是尽量将改功能模块化,接口化,方便调用。