연락처 한글 초성 검색

2016. 3. 28. 10:14Android

반응형
public class ContactSearcher {
private static final char HANGUL_BEGIN_UNICODE = 44032; // 가
private static final char HANGUL_LAST_UNICODE = 55203; // 힣
private static final char HANGUL_BASE_UNIT = 588; // 각 자음마다 가지는 글자 수
// 자음
private static final char[] INITIAL_SOUND={'ㄱ','ㄲ','ㄴ','ㄷ','ㄸ','ㄹ','ㅁ','ㅂ','ㅃ','ㅅ','ㅆ','ㅇ','ㅈ','ㅉ','ㅊ','ㅋ','ㅌ','ㅍ','ㅎ'};

public ContactSearcher(){

}

/*
* 해당 문자가 INITIAL_SOUND인지 검사
*/
private static boolean inInitialSound(char searcher){
for(char c : INITIAL_SOUND){
if(c == searcher){
return true;
}
}
return false;
}

/*
* 해당 문자의 자음을 얻는다.
* */
private static char getInitialSound(char c){
int hanBegin = (c - HANGUL_BEGIN_UNICODE);
int index = hanBegin / HANGUL_BASE_UNIT;

if(index < 0) // 연락처 이름에 공백이 있을 경우 index가 -값이 나옴

return c;

else
return INITIAL_SOUND[index];


}

/**
* 해당 문자가 한글인지 검사
*/
private static boolean isHangul(char c){
return HANGUL_BEGIN_UNICODE <= c && c <= HANGUL_LAST_UNICODE;
}

/**
* 검색을 한다, 초성 검색 완벽 지원함
* @param value : 검색 대상
* @param search : 검색어
* @return 매칭 되는것 찾으면 true 못찾으면 false
*/
public static boolean matchString(String value, String search){
int t = 0;
int seof = value.length() - search.length();
int slen = search.length();

if(seof < 0) return false; // 검색어가 더 길면 false를 리턴

for(int i=0; i<=seof; i++){
t=0;

while(t<slen){
if(inInitialSound(search.charAt(t)) == true && isHangul(value.charAt(t))){
// 만약 현재 char이 초성이고 value가 한글이면
if(getInitialSound(value.charAt(i+t)) == search.charAt(t))
// 각각의 초성끼리 같은지 비교
t++;
else
break;
}else{
// char이 초성이 아니라면
if(value.charAt(i+t) == search.charAt(t))
// 그냥 같은지 비교
t++;
else
break;
}
}

if(t == slen) return true; // 모두 일치한 결과를 찾으면 true
}
return false; // 일치하지 못하면 false
}


}

반응형

'Android' 카테고리의 다른 글

페이스북 간편 로그인  (0) 2016.03.29
Utils class  (0) 2016.03.28
include 태그 사용  (0) 2016.03.28
EditText focus 없애기  (0) 2016.03.28
자신의 휴대폰 번호 가져오기  (0) 2016.03.28