在我的应用程序中,我从手机中获得联系人列表。 我需要通过联系人列表实现上下文过滤/搜索机制。
过滤条件: 按联系人名称过滤,其中的字母位于数字键上(所有可能的组合)!
当我输入每个新号码时,应该更改列表,只留下合适的联系人。
喜欢这里。
http://i.stack.imgur.com/IXZmJ.png
我输入“253”,申请人找到了ALE。 请帮我这样做。
private List<Contact> contacts = new ArrayList<Contact>();
private List<Contact> sortContacts = new ArrayList<Contact>();
int textlength = 0;
TextView textView;
private class CustomTextWatcher implements TextWatcher {
public void onTextChanged(CharSequence s, int start, int before,
int count) {
textlength = textView.getText().length();
for (int i = 0; i < contacts.size(); i++) {
if (textlength <= contacts.get(i).getName().length()) {
// need help here
}}}}
答案 0 :(得分:3)
您可以使用trie或radix tree来获取具有特定背景的所有字符串。
但请注意,在您的情况下 - 您正在检查每次搜索中的多个前缀,可能的解决方案是持有代表字符串的数字的trie,并且trie的引导将指向它实际上的字符串代表(可能有一次以上)。
在查找号码时,请使用前缀号码中的简单DFS来获取所有相关字符串。
如果名单列表没有经常变化,那么特里可能是一种过度杀伤力。您可以改为存储元组(number,string)
,其中number
是代表编号,string
是排序数组中的名称,并使用binary search获取带有所需前缀的第一个数字,一旦找到,只需用线性搜索返回所有名称。
但请注意,在这种情况下插入新条目将为O(n)
,因此如果确实经常发生 - 请避免使用此解决方案,因为预计效率不高。