# 검색 조건      1) 초성검색어는 최소 두 자리 이상 입력
                     2) 결과는 매출이
가장 많은 순서(도서가격 * 판매건수)로 내림차순
                     3) 초성 이외(영문,한글)의
문자는 검색에서 제외
                     public class
HangulChosungSearch {
                         private static final char
INITIAL_SOUND_BEGIN_UNICODE = 12593; // 초성 유니코드
시작 값
                         private static final char
INITIAL_SOUND_LAST_UNICODE = 12622;  // 초성 유니코드
마지막 값
                         private static final char
HANGUL_BEGIN_UNICODE = 44032;        // 한글 유니코드
시작 값
                         private static final char
HANGUL_LAST_UNICODE = 55203;         // 한글 유니코드
마지막 값
                         private static final char
NUMBER_BEGIN_UNICODE = 48;           // 숫자 유니코드
시작 값
                         private static final char
NUMBER_LAST_UNICODE = 57;            // 숫자 유니코드
마지막 값
                         private static final char
ENGLISH_ROWER_BEGIN_UNICODE = 65;    // 영문(소문자) 유니코드 시작 값
                         private static final char
ENGLISH_ROWER_LAST_UNICODE = 90;     // 영문(소문자) 유니코드 마지막 값
                         private static final char
ENGLISH_UPPER_BEGIN_UNICODE = 97;    // 영문(대문자) 유니코드 시작 값
                         private static final char
ENGLISH_UPPER_LAST_UNICODE = 122;    // 영문(대문자) 유니코드 마지막 값
                         private static final char
HANGUL_BASE_UNIT = 588;              // 자음 마다 가지는
글자수
                                                                                       
// 초성
                         private static final char[]
INITIAL_SOUND =
                             {'ㄱ', 'ㄲ', 'ㄴ', 'ㄷ', 'ㄸ', 'ㄹ', 'ㅁ', 'ㅂ', 'ㅃ'
                            , 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅉ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ'};
                         // 초성 검색에
대한 상품 리스트
                         public static final
String[][] ITEM_ARRAY = new
String[][]{
                           //  상품번호 , 도서명 , 도서가격 , 판매건수
                              {"8798725", "샐러드를 좋아하는
사자, 사슴?", "11700", "5"}
                            , {"8787608", "아날로그 사랑법", "12600", "32"}
                            , {"8809046", "엄마가 있어줄게", "12420", "72"}
                            , {"8762353", "하고 싶다, 연애", "12600", "12"}
                            , {"8822780", "버스 타고 제주여행
제주 구석구석 즐기는 법", "12600", "5"}
                            , {"8824942", "대한민국 사진여행지 100", "15120", "21"}
                            , {"8885635", "베스트 오브
유럽  230", "11900", "22"}
                            , {"8930742", "지면서 이기는
관계술", "13500", "6"}
                            , {"8885924", "공부와 열정", "11700", "9"}
                            , {"7845549", "소셜 웹 마이닝", "21600", "121"}
                            , {"243767", "학문의 즐거움", "7120", "851"}
                            };
                         /**
                          * 입력받은 문자가 초성인지 체크
                          */
                         private static boolean
isInitialSound(char c){
                             for(int i=0;
i<INITIAL_SOUND.length; i++){
                                 if(INITIAL_SOUND[i]
== c){
                                     return true;
                                 }
                             }
                             return false;
                         }
                         /**
                          * 입력받은 문자의 자음을 추출
                          */
                         private static char
getInitialSound(char c){
                             int
hanBegin = (c - HANGUL_BEGIN_UNICODE);
                             int index =
hanBegin / HANGUL_BASE_UNIT;
                             return
INITIAL_SOUND[index];
                         }
                         /**
                          * 입력받은 문자가 한글인지 체크
                          */
                         private static boolean
isHangul(char c){
                             return
HANGUL_BEGIN_UNICODE <= c && c <= HANGUL_LAST_UNICODE;
                         }
                         /**
                         * 숫자, 영문(대소문자), 한글, 초성
등의 유니코드를 체크
                         */
                         private static boolean
checkUnicode(char c){
                             if ((   (c >= NUMBER_BEGIN_UNICODE && c
<= NUMBER_LAST_UNICODE)
                                  || (c >=
ENGLISH_UPPER_BEGIN_UNICODE && c <= ENGLISH_UPPER_LAST_UNICODE)
                                  || (c >=
ENGLISH_ROWER_BEGIN_UNICODE && c <= ENGLISH_ROWER_LAST_UNICODE)
                                  || (c >= HANGUL_BEGIN_UNICODE
&& c <= HANGUL_LAST_UNICODE)
                                  || (c >=
INITIAL_SOUND_BEGIN_UNICODE && c <= INITIAL_SOUND_LAST_UNICODE))
                                ){
                                 return true;
                             }else{
                                 return false;
                             }
                         }
                         /**
                         * 검색어와 검색 대상 값을 입력받아서 일치여부 확인
                         */
                         public static boolean
matchString(String keyword, String value){
                             int t = 0;
                             int seof =
value.length() - keyword.length();
                             int slen =
keyword.length();
                             // 검색어가 검색대상값보다
더 길거나, 검색어가 두개 이하일때 false 리턴
                             if(seof
< 0 || keyword.length() < 2){
                                 return false;
                             }
                             for(int i = 0;i
<= seof;i++){
                                 t = 0;
                                 while(t <
slen){
                                     // 숫자, 초성, 한글, 영문(대소문자)를 제외한 다른 값은
false 리턴
                                     if(!checkUnicode(keyword.charAt(t))){
                                         return false;
                                     }
                                     // 검색어가 초성이이고
한글이면 초성끼리 비교
                                     if(isInitialSound(keyword.charAt(t))
&& isHangul(value.charAt(i+t))){
                                         // 각각의 초성이
같은지 비교
                                         if(getInitialSound(value.charAt(i+t))
== keyword.charAt(t)){
                                             t++;
                                         }else{
                                             break;
                                         }
                                     } else {
                                         // 초성이 아닐경우
비교
                                         if(value.charAt(i+t)
== keyword.charAt(t)){
                                             t++;
                                         }else{
                                             break;
                                         }
                                     }
                                 }
                                 // 검색어의 길이만큼
모두 일치하면 true를 리턴
                                 if(t ==
slen){
                                     return true;
                                 }
                             }
                             return false; // 일치하지 않으면 false를 리턴
                         }
                         /**
                         * 상품명 검색및 매출액에 따른 정렬
                         */
                         public static void
searchItem(String keyword){
                             String[] itemTitle = new
String[20]; // 상품명을 담을 변수
                             int[]
machool = new int[20];         // 매출금액을 담을
변수
                             // 총 상품의 건수만큼 for 문을 수행
                             for(int i=0;
i<ITEM_ARRAY.length; i++){
                                 // 키워드와 매칭되는
상품이 존재하면, 상품명과 매출액을 배열에 각각 저장
                                 if(matchString(keyword,
ITEM_ARRAY[i][1])){
                                     itemTitle[i] =
ITEM_ARRAY[i][1];
                                     machool[i] =
Integer.parseInt(ITEM_ARRAY[i][2])*Integer.parseInt(ITEM_ARRAY[i][3]);
                                 }
                             }
                             // 매출액이 큰
순서부터 내림차순 정렬
                             for (int i = 0;
i < machool.length; i++){
                                 boolean changed
= false;
                                 for (int j = i +
1; j < machool.length; j++){
                                     if
(machool[j] > machool[i]){
                                         // 매출액의 순서를
정렬
                                         int
tempMachool = machool[j];
                                         machool[j] = machool[i];
                                         machool[i] = tempMachool;
                                         // 상품명의 순서를
정렬
                                         String tempItemTitle =
itemTitle[j];
                                         itemTitle[j] =
itemTitle[i];
                                         itemTitle[i] =
tempItemTitle;
                                         changed = true;
                                     }
                                 } // 정렬 for문 종료
                                 if
(!changed){ // 더이상 순서 변경이 없으면 for문을
빠져 나옴
                                     break;
                                 }
                                 System.out.println("도서명 :"+itemTitle[i]+",
매출액 :"+machool[i]);
                             } // 전체 for문 종료
                         }
                         // 메인 메서드
                         public static void
main(String[] arr){
                             // 검색할 초성
입력
                             searchItem("ㅈㄱ");
                         }
                     }
                     /*
                     ### 출력 결과 ###
                     도서명 :학문의 즐거움, 매출액
:6059120
                     도서명 :엄마가 있어줄게, 매출액
:894240
                     도서명 :버스 타고 제주여행 제주 구석구석 즐기는 법, 매출액 :63000
                     */
 
댓글 없음:
댓글 쓰기