티스토리 뷰
한글 초성 검색 기능이 필요하여 구현해 보았다.
기본 적인 원리는
가~깋 나~닣.......... 하~힣
을 사용 한것.
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
- Troubleshooting
- gcc
- C++
- it
- winapi
- jni
- C
- 음악
- kering
- Visual C++
- Quiz
- java
- android
- MFC
- Python
- linux
- NDK
- algorithm
- AWS
- 안드로이드
- source
- Cloud
- db
- driver
- API
- 드라이버
- database
- jni강좌
- 리눅스
- 프로그래밍
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
글 보관함