Android中高效的SearchView建议
我在ActionBar中有一个SearchView,在用户键入字符时显示建议。 我的建议存储在字符串数组列表中,如下所示:Android中高效的SearchView建议,android,actionbarsherlock,performance,searchview,Android,Actionbarsherlock,Performance,Searchview,我在ActionBar中有一个SearchView,在用户键入字符时显示建议。 我的建议存储在字符串数组列表中,如下所示: private ArrayList<String> mSuggestions; 它具有O(n)效率,因为它在数组中迭代搜索查询的单词。因此,当mSuggestions.size()增长时,它会变得缓慢且无效 我想使用另一个比ArrayList更高效的容器来进行搜索O(log(n)),但还没有找到最合适的容器 有人对此有什么建议吗 预先感谢。 < P>因为你正在
private ArrayList<String> mSuggestions;
它具有O(n)效率,因为它在数组中迭代搜索查询的单词。因此,当mSuggestions.size()增长时,它会变得缓慢且无效
我想使用另一个比ArrayList更高效的容器来进行搜索O(log(n)),但还没有找到最合适的容器
有人对此有什么建议吗
预先感谢。
< P>因为你正在执行子串搜索,你可以考虑使用一个哈希映射将每个可能的子串映射到包含子串的对象列表(<代码> HashMap < /代码>)。这假设您的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;
}
private Map mObjectLookupMap=
新的HashMap();
//使用所有可能的子字符串预计算查找映射
公共布尔onQueryTextChange(字符串newText){
mSuggestions.clear();
if(mObjectLookupMap.containsKey(newText)){
for(MyObject o:mObjectLookupMap.get(newText))
添加(o.getName());
}
返回false;
}
更节省空间的解决方案可能是使用存储子字符串的。然后,您的查找时间将与最长的MyObject名称(即子字符串树的深度)保持一致。要获得真正有效的结果,您可以查看SQLite FTS3虚拟表,但它很复杂,并且根据数据库记录的数量第一次构建表需要时间。谷歌搜索FTS3。我认为Android开发者网站也有一个如何使用它的例子。听起来很有趣。我搜索的是更高层次的东西,比如使用另一个容器而不是ArrayList,或者任何算法。谢谢你的回复。
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;
}