[英]Efficient SearchView suggestions in Android
我的ActionBar中有一個SearchView,在用戶鍵入字符時顯示建議。 我的建議存儲在String ArrayList中,如下所示:
private ArrayList<String> mSuggestions;
然后,我的搜索功能將根據查詢的文本顯示建議。
public boolean onQueryTextChange(String newText) {
mSuggestions.clear();
for(MyObject o : mObjects)
if(o.getName().contains(newText))
mSuggestions.add(o.getName());
return false;
}
它具有O(n)效率,因為它遍歷數組以搜索查詢的單詞。 因此,當mSuggestions.size()增長時,它將變得緩慢且效率低下。
我想使用比ArrayList更有效的另一個容器進行搜索O(log(n)) ,但是還沒有找到最合適的容器。
有人對此有任何建議嗎?
提前致謝。
由於您正在執行子字符串搜索,因此可以考慮使用HashMap,該映射將每個可能的子字符串映射到包含該子字符串的對象列表( HashMap<String, List<MyObject>>
)。 這假定您的mObjects
列表未針對每個查詢更新(例如,如果您正在基於查詢查詢網絡以加載結果),並且您能夠預先計算保持或多或少靜態的數據結構。 然后,您的查找將在O(1)中完成,但是您需要在空間效率上付出代價來存儲所有子字符串。 您的代碼如下所示:
private Map<String, List<MyObject>> mObjectLookupMap =
new HashMap<String, List<MyObject>>();
// precompute lookup map with all possible substrings
public boolean onQueryTextChange(String newText) {
mSuggestions.clear();
if (mObjectLookupMap.containsKey(newText)) {
for (MyObject o : mObjectLookupMap.get(newText))
mSuggestions.add(o.getName());
}
return false;
}
節省空間的解決方案可能是使用Trie存儲子字符串。 然后,您的查找時間將與最長的MyObject名稱(即子字符串樹的深度)一致。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.