Android - Поиск контакта по нечеткому/приблизительному/похожему совпадению

Есть способы найти контакт по отображаемому имени. Например, этот ответ Android - найти контакт по отображаемому имени

Но мне нужно найти контакты с нечетким совпадением. Например, Мне нужно вернуть контакт по имени «Ким», если «Ким» не найден.

Как я могу это сделать?


person simplfuzz    schedule 09.06.2017    source источник


Ответы (1)


Не существует API-интерфейса сборки, который может выполнять нечеткий поиск по отображаемым именам, но вы можете сделать это самостоятельно, это не должно быть так сложно:

  1. Прочитать все имена контактов из БД
  2. Используйте алгоритм сравнения строк сходства, например Jaro Winkler, для сравнения с запрошенным именем.
  3. Вернуть лучший матч

Для первого шага вот код:

Map<String, Long> contacts = new HashMap<String, Long>();

String[] projection = {Contacts._ID, Contacts.DISPLAY_NAME};
// use null if you want to include hidden contacts
String selection = Contacts.IN_VISIBLE_GROUP + "=1"; 
Cursor cur = cr.query(Contacts.CONTENT_URI, projection, selection, null, null);

while (cur != null && cur.moveToNext()) {
    long id = cur.getLong(0);
    String name = cur.getString(1);
    contacts.put(name, id);
}
if (cur != null) {
    cur.close();
}

Для шага 2 вы можете использовать Jaro Winkler или какой-либо другой алгоритм расстояния между строками, вот библиотека, которая может вам помочь: https://github.com/tdebatty/java-string-similarity

person marmor    schedule 11.06.2017