티스토리 뷰

한글 초성 검색 기능이 필요하여 구현해 보았다.

기본 적인 원리는

가~깋 나~닣.......... 하~힣
을 사용 한것.

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가 리턴 되면 찾은 것이다


댓글
  • BlogIcon BBongGyun 초성검색 알고리즘을 찾고있었는데,
    딱 알맞는 코드네요, 사용해도 될까요?
    2011.04.26 11:28
  • BlogIcon jhbaek 안녕하세요 BBongGyun님~
    제 블로그에 방문해주셔서 감사합니다^^
    얼마든지 사용하셔도 됩니다.
    좋은하루되세요 :D
    2011.04.26 13:06 신고
  • BlogIcon BBongGyun 감사합니다, 잘쓸게요^^ 2011.04.26 13:42
  • 치즈달걀말이 우와 이거 그냥 사용해도 되는 건가요? 멋지십니다. 2011.06.22 18:47
  • BlogIcon jhbaek 예 마음대로 사용하셔도 됩니다 ^^
    감사합니다~
    2011.06.22 21:39 신고
  • BlogIcon 蛇骨 필요한 내용이여서 허락없이 제가 가져가서 javascript로 변환을 하고 블로그에 올려버렸는데

    혹시 문제가 된다면 바로 삭제하겠습니다.
    2011.11.18 00:30
  • BlogIcon jhbaek 안녕하세요~
    링크따라서 블로그에 들어가보았습니다
    http://roter.pe.kr/122
    출처 남겨주시면 감사하겠습니다 ^^
    좋은 하루 보내세요~!
    2011.11.22 10:14 신고
  • BlogIcon 蛇骨 말씀하신대로 처리해뒀습니다.

    허락해주셔서 감사합니다.
    2011.11.24 08:45
  • 안드로이드개발자 아 감사합니다~! 잘써먹었어요~^^ 2012.01.12 16:02
  • BlogIcon jhbaek 안녕하세요~ 이소스를 보러 오는 분들이 굉장히 많네요 ㅎㅎ 이쁘게(?) 사용하세요 ^^ 들려주셔서 감사합니다! 2012.01.29 23:16 신고
  • BlogIcon heymikachu 안녕하세요. 전 소스나 코딩에 대해선 완전 무지한 사람인데요. 사용중인 커스텀롬의 T9 다이얼러에 한글 초성 검색을 추가하고 싶습니다. 혹시 저 소스를 T9 다이얼러에 적용하는데 도움을 주실 수 있을까요..? 그냥 다이얼패드에 abc대신 ㄱㄴㄷ만 추가했더니 초성으로 불러오지 못하고 ㄱㄴㄷ로 저장된 것만 찾을 수 있더라구요;; https://github.com/IceColdSandwich/android_packages_apps_Contacts/blob/ics/src/com/android/contacts/dialpad/T9Search.java
    여기에서 별도로 한글 초성검색을 위해 뭘 추가해야될 거 같은데 어디에 넣어야 되는지 모르겠네요..
    2012.02.16 17:54
  • BlogIcon jhbaek 안녕하세요 방문해주셔서 감사합니다^^
    현재는 소스를 봐드리고있지는 않습니다..
    답변이 늦었는데 그 사이에 구하셨길 바랍니다.
    좋은 하루 보내세요 :)
    2012.02.23 01:15 신고
  • 감사합니다 완전 감사합니다 덕분에 주소록 검색에 큰 도움이 되었습니다 감사합니다~~ 2013.02.19 18:32
  • BlogIcon jhbaek 안녕하세요~ 제 블로그에는 이 자료를 보러 오는 분들이 가장 많은 것 같습니다 ^^; 나중에 KMP로 한 번 수정해야 할 텐데요~ 방문해 주셔서 감사합니다 ^^ 2013.03.09 14:38 신고
  • 감사합니다. 감사합니다. ㅎㅎㅎㅎ잘 사용하겠습니다^^ 2013.07.18 20:53
  • dd 감사해요. 친구검색 구현에 많은 도움이 됐습니다~ 2013.12.06 18:20
  • 돌비 좋은 자료 고맙습니다~~~
    덕분에 많은 시간을 절약할수 있었습니다.
    2014.07.15 13:14
  • 감사합니다. 덕분에 초성 검색을 해결할 수 있었네요.
    감사합니다.
    2014.08.07 11:23
  • BlogIcon jhbaek 위의 4분 모두 감사합니다^^ 좋은 프로그램 만드시길! 2015.01.13 22:11 신고
  • 감사합니다. 감사합니다. 덕분에 초성 검색 간단히 해결 했습니다.^^ 2015.07.06 17:20
  • BlogIcon jhbaek 그냥 가져다 쓰시기만 하면 되니까 간단하지요^^
    유용하게 쓰세요~
    2015.08.30 22:24 신고
  • BlogIcon kurt 안녕하세요. 이 코드 상용에 사용해도 될까요? 감사합니다:-) 2016.06.23 17:40
  • BlogIcon jhbaek 옙 자유롭게 사용하세요~! 2016.07.02 21:23 신고
  • 베이직 초면에 실례합니다. 글에 CCL로 비영리가 걸려 있는데, 해당 코드를 영리 목적에 사용해도 되는 건가요? 2016.08.29 23:48
  • BlogIcon jhbaek 안녕하세요 ^^
    사용하시기 전에 'roter님 감사합니다' 라고 한번 외치시고 쓰는 조건으로 특별히 허락해드리겠습니다 ㅋㅋ
    2016.11.09 20:00 신고
  • 로터님감사 감사합니당 잘 사용하겠습니다~ 2019.03.13 14:14
댓글쓰기 폼