티스토리 뷰
한글 초성 검색 기능이 필요하여 구현해 보았다.
기본 적인 원리는
가~깋 나~닣.......... 하~힣
을 사용 한것.
http://www.androidpub.com/45681 를 참조하여 구현하였다.
사용 법은 평범하다.
SoundSearcher.matchString("검색할대상","검색어");
ex)
SoundSearcher.matchString("안녕하세요","ㅇㄴ하"); //true
SoundSearcher.matchString("반갑습니다","ㅂㄱ습ㄴ"); //true
SoundSearcher.matchString("안녕히가세요","ㅇㄴㅎㅎ"); //false
TRUE가 리턴 되면 찾은 것이다
기본 적인 원리는
가~깋 나~닣.......... 하~힣
을 사용 한것.
http://www.androidpub.com/45681 를 참조하여 구현하였다.
/**
* 초성 검색 알고리즘을 위한 클래스 이다.
* @author roter
* http://www.jhb.kr
*/
public class SoundSearcher
{
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 = { 'ㄱ', 'ㄲ', 'ㄴ', 'ㄷ', 'ㄸ', 'ㄹ', 'ㅁ', 'ㅂ', 'ㅃ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅉ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ' };
/**
* 해당 문자가 INITIAL_SOUND인지 검사.
* @param searchar
* @return
*/
private static boolean isInitialSound(char searchar){
for(char c:INITIAL_SOUND){
if(c == searchar){
return true;
}
}
return false;
}
/**
* 해당 문자의 자음을 얻는다.
*
* @param c 검사할 문자
* @return
*/
private static char getInitialSound(char c) {
int hanBegin = (c - HANGUL_BEGIN_UNICODE);
int index = hanBegin / HANGUL_BASE_UNIT;
return INITIAL_SOUND[index];
}
/**
* 해당 문자가 한글인지 검사
* @param c 문자 하나
* @return
*/
private static boolean isHangul(char c) {
return HANGUL_BEGIN_UNICODE <= c && c <= HANGUL_LAST_UNICODE;
}
/**
* 생성자.
*/
public SoundSearcher() { }
/** * 검색을 한다. 초성 검색 완벽 지원함.
* @param value : 검색 대상 ex> 초성검색합니다
* @param search : 검색어 ex> ㅅ검ㅅ합ㄴ
* @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(isInitialSound(search.charAt(t))==true && isHangul(value.charAt(i+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를 리턴한다.
}
}
사용 법은 평범하다.
SoundSearcher.matchString("검색할대상","검색어");
ex)
SoundSearcher.matchString("안녕하세요","ㅇㄴ하"); //true
SoundSearcher.matchString("반갑습니다","ㅂㄱ습ㄴ"); //true
SoundSearcher.matchString("안녕히가세요","ㅇㄴㅎㅎ"); //false
TRUE가 리턴 되면 찾은 것이다
'Development > Mobile' 카테고리의 다른 글
| [Android] Thread Kill (interrupt) (6) | 2010.10.18 |
|---|---|
| [Android/JAVA] How do I convert InputStream to String? (0) | 2010.10.10 |
| [Android] 배포용 keystore 제작 및 싸인 하기(구글맵 쓰는 경우 포함) (9) | 2010.10.01 |
| [Android] 폰 부팅시 어플리케이션 실행 (3) | 2010.09.30 |
| [Android] HttpPut으로 서버에 Entity 보내기 (1) | 2010.09.25 |
| [Android] 현재 내 위치 출력하기 (2) | 2010.09.22 |
| [Android] SD Card 사용하기 (0) | 2010.09.21 |
| [Android] SAX Parsing시 쓸데없는 공백이 많이 포함 되는 경우 (0) | 2010.09.12 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- MFC
- gcc
- jni강좌
- 드라이버
- Cloud
- winapi
- Quiz
- algorithm
- Troubleshooting
- NDK
- C++
- Visual C++
- jni
- API
- 프로그래밍
- C
- AWS
- kering
- 음악
- 리눅스
- driver
- 안드로이드
- it
- android
- java
- db
- linux
- database
- source
- Python
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |
글 보관함