在我的应用程序中,我从电话中获取联系人列表。 我需要通过联系人列表实现上下文过滤器/搜索机制。
过滤条件: 根据联系人姓名在数字键上的字母(所有可能的组合)进行过滤!
当我输入每个新的号码列表时,应该只留下合适的联系人。
喜欢这里。
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
}}}}
最佳答案
您可以使用 trie 或 radix tree 来获取具有特定前缀的所有字符串。
但是请注意,在您的情况下 - 您在每次搜索中检查多个前缀,一个可能的解决方案是持有代表字符串的数字的 trie,并且 trie 的引导将指向它实际上的字符串代表(可能不止一次)。
查找数字时,使用前缀数字中的简单 DFS 来获取所有相关字符串。
如果名称列表变化不是太频繁,则 trie 可能有点矫枉过正。您可以改为存储元组 (number,string)
,其中 number
是代表数字,string
是排序数组中的名称,并使用 binary search获取具有所需前缀的第一个数字,并在找到后通过线性搜索返回所有名称。
但是请注意,在这种情况下插入一个新条目将是 O(n)
,因此如果它确实经常发生 - 请避免使用此解决方案,因为它预计效率不高。
关于android - 手机联系人android中的搜索算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12850308/