我有一个搜索框,用来搜索名单中的人。以下是每次查询更改时运行的代码。我找不到任何开源的,所以我想确保这看起来很好和有效率。
看起来怎么样?
private final List<String> mTotalNames = ............ // some ArrayList<String> with all the names
private final List<String> mAvailableNames = new ArrayList<String>(mTotalNames);
private void doOnQueryTextChange(final String s) {
mAvailableNames.clear();
if (s.length() <= 0) {
mAvailableNames.addAll(mTotalNames);
} else {
final String query = s.toLowerCase();
for (String name : mTotalNames) {
name = name.toLowerCase();
final List<String> partNameList
= new LinkedList<String>(Arrays.asList(name.split("\\s+")));
if (helper0(query, partNameList)) {
mAvailableNames.add(user);
}
}
}
// yeah, out mAvailableNames is all updated
}
private static boolean helper0(final String query, final List<String> partNameList) {
for (String partQuery : query.split("\\s+")) {
if (!helper1(partQuery, partNameList)) {
return false;
}
}
return true;
}
private static boolean helper1(final String partQuery, final List<String> partNameList) {
if (partQuery.trim().length() <= 0) return true;
final Iterator<String> iterator = partNameList.iterator();
while (iterator.hasNext()) {
final String partName = iterator.next();
if (partName.startsWith(partQuery)
|| partName.trim().length() <= 0) {
iterator.remove();
return true;
}
}
return false;
}发布于 2014-12-31 14:47:07
注意:在这个问题中,这个答案中提出的概念是在下面的“备用”实现中实现的:未定义
有趣的问题。您的代码很难阅读,不是因为它是非结构化的,或者是混乱的,而是因为助手函数的名称很难理解.他们干些什么?
所以,从好的方面来说,你的“视觉”风格是一致的,整洁的。你所有的线条都有很好的缩进和支撑,等等。嗯,除了这一行:
if (partQuery.trim().length() <= 0) return true;第一个问题是命名..。四件事:
helper0和helper1。不管名字是什么,都不要帮忙。m是什么意思?mTotalNames应该是totalNames。您正在使用某种类型的“匈牙利”符号,这在Java中不是很好的实践。partQuery,partName,partNameList,很难记住哪些变量是哪个变量。iterator是个可怕的名字。我们知道它是一个迭代器,但是它迭代什么呢?在这种情况下,正确的数据结构将有很大帮助。你在做和重复太多的工作。考虑到这一点:
您需要的是一个更好的算法,而正确的一个是构建三轮车。
trie将由名称中的字符索引。这将允许您以非常快速的方式搜索名称,而不会重复执行任何开销处理。构建trie一次,然后在键入时反复使用它来筛选名称。
您的代码将无法正确处理特定名称/查询的子集。
想想“安迪·安德森”这个名字,还有搜索“和安迪”.这将不匹配,因为搜索查询词' and‘将首先与'Andy’匹配,然后剩下搜索词'Andy',这将与'Anderson‘这个词不匹配。
您需要按长度递减顺序对搜索项进行排序,并且始终首先使用最长的查询项进行搜索。
这个话题引起了我的兴趣,我可以自己来实现我推荐的解决方案.再过一天左右。
发布于 2014-12-31 05:30:18
首先有几个:
mFriendsList?应该是mTotalNames。new ArrayList<>(mTotalNames.size());,因为您已经在您的函数中处理这个问题了。私有List mAvailableNames =新ArrayList(mTotalNames);helper0, helper1.StringUtils.isBlank()代替此检查空空查询字符串: if (s.length() <= 0)https://codereview.stackexchange.com/questions/75311
复制相似问题