2016. 3. 28. 10:14ㆍAndroid
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 |