簡體   English   中英

Android中高效的SearchView建議

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM