5

Android 開発者サイトのこの連絡先リストの取得チュートリアルに従って、連絡先検索機能を実装することができました。これまでの私のコードは次のとおりです

private void retrieveContactRecord(String phoneNo) {
        try {
            Log.e("Info", "Input: " + phoneNo);
            Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI,
                    Uri.encode(phoneNo));
            String[] projection = new String[]{ContactsContract.PhoneLookup._ID, ContactsContract.PhoneLookup.DISPLAY_NAME};


            String sortOrder = ContactsContract.PhoneLookup.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
            ContentResolver cr = getContentResolver();
            if (cr != null) {
                Cursor resultCur = cr.query(uri, projection, null, null, sortOrder);
                if (resultCur != null) {
                    while (resultCur.moveToNext()) {
                        String contactId = resultCur.getString(resultCur.getColumnIndex(ContactsContract.PhoneLookup._ID));
                        String contactName = resultCur.getString(resultCur.getColumnIndexOrThrow(ContactsContract.PhoneLookup.DISPLAY_NAME));
                        Log.e("Info", "Contact Id : " + contactId);
                        Log.e("Info", "Contact Display Name : " + contactName);
                        break;
                    }
                    resultCur.close();
                }
            }
        } catch (Exception sfg) {
            Log.e("Error", "Error in loadContactRecord : " + sfg.toString());
        }
    }

ここにキャッチがあります。このコードは非常にうまく機能しますが、ここでスマート検索を実装する必要があります。26268 を Amanu と 094 526 2684 に一致させたいと思います。これは T9 辞書と呼ばれていると思います。

手がかりを得るために他のプロジェクトを調べてみましたが、何も見つかりませんでした。任意のポインタをいただければ幸いです!

4

3 に答える 3

3

T9 検索は、トライ データ構造を使用して実装できます。ここで例を見ることができます - Trie dict。同様のものを実装した後、検索入力を可能な T9 デコードされたバリアントに変換し、それが名前と一致するかどうかを比較できます。

于 2016-05-22T08:55:42.617 に答える
1

すべての連絡先を HashSet にダンプする

Set<String> contacts = new HashSet<String>();

次に検索します。

List<List<String>> results = new ArrayList<List<String>>();
// start the search, pass empty stack to represent words found so far
search(input, dictionary, new Stack<String>(), results);

検索方法(@WhiteFang34 より

public static void search(String input, Set<String> contacts,
    Stack<String> words, List<List<String>> results) {

    for (int i = 0; i < input.length(); i++) {
        // take the first i characters of the input and see if it is a word
        String substring = input.substring(0, i + 1);

        if (contacts.contains(substring)) {
            // the beginning of the input matches a word, store on stack
            words.push(substring);

            if (i == input.length() - 1) {
                // there's no input left, copy the words stack to results
                results.add(new ArrayList<String>(words));
            } else {
                // there's more input left, search the remaining part
                search(input.substring(i + 1), contacts, words, results);
            }

            // pop the matched word back off so we can move onto the next i
            words.pop();
        }
    }
}
于 2016-03-10T21:59:58.457 に答える