0

在我的应用程序中,我从电话中获取了联系人列表。我需要通过联系人列表实现上下文过滤/搜索机制。

过滤条件:根据数字键上的字母(所有可能的组合)按联系人姓名过滤!

当我输入每个新号码列表时,应更改仅留下合适的联系人。

像这儿。

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
                                                                       }}}}
4

1 回答 1

3

您可以使用trie基数树来获取具有特定前缀的所有字符串。

但是请注意,在您的情况下 - 您在每次搜索中检查多个前缀,一个可能的解决方案是持有代表字符串的数字的 trie,并且 trie 的前导将指向它实际代表的字符串(有可能不止一次)。
查找数字时,使用前缀数字中的简单DFS来获取所有相关字符串。

如果名称列表不经常更改,则尝试可能会过大。相反,您可以将表示数字和名称的元组存储(number,string)number排序string数组中,并使用二进制搜索来获取具有所需前缀的第一个数字,并在找到后通过线性搜索返回所有名称。
但是请注意,在这种情况下插入一个新条目将会是O(n),因此如果它确实经常发生 - 请避免使用此解决方案,因为它预计效率不高。

于 2012-10-11T23:52:05.353 回答