2012-10-11 2 views
0

내 애플리케이션 휴대 전화에서 연락처 목록을 가져옵니다. 연락처 목록을 통해 컨텍스트 필터/검색 메커니즘을 구현해야합니다.휴대 전화의 검색 알고리즘 연락처 android

필터 조건 : 문자가 숫자 키 (가능한 조합)에 있음에 따라 연락처 이름으로 필터 됨!

내가 각 새 번호를 입력 할 때 목록은 적절한 연락처 만 남겨두고 변경해야합니다.

여기에 좋아요.

http://i.stack.imgur.com/IXZmJ.png

I 입력 "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 
                     }}}} 

답변

3

당신은 trie 또는 radix tree 특정 perfix 모든 문자열을 얻을 수 있습니다.

그러나 각 검색에서 접두사의 수를 확인하는 중 가능한 해결책은 문자열을 나타내는 숫자를 유지하는 것이고 trie의 선두는 문자열을 가리킬 것입니다 실제로 나타납니다 (한 번 이상있을 수 있음).
숫자를 찾을 때 접두사 번호에서 간단한 DFS을 사용하여 모든 관련 문자열을 가져옵니다.

이름 목록이 너무 자주 변경되지 않으면 트라이가 과도한 것일 수 있습니다. 대신 튜플을 저장할 수 있습니다. (number,string)number이 대표 번호이고 string이 정렬 된 배열의 이름 인 경우 binary search을 사용하여 필요한 접두어가있는 첫 번째 숫자를 얻은 다음 모든 이름을 선형 검색으로 반환합니다.
그러나이 경우 새 항목을 삽입하면 O(n)이되므로 자주 발생하지 않는 경우 효율적이지 않을 것으로 예상되므로이 솔루션을 사용하지 마십시오.

관련 문제