입력모드가 한글인 상태로 타이핑을 하고, 이것이 영어단어일 경우에 영어로 변경하기 위한 데이터 추출 프로그램을 작성합니다.
ab aba abaca abaci aback abacus abaft abalone abandon abandoned abandoner
절대 한글로 칠 수 없는 단어도 있지만, 한글과 겹치는 단어들도 존재합니다. 이를 구별할 필요가 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | HashMap<String, Integer> mWords = new HashMap<String, Integer>();List<WordInfo> mWordList = new ArrayList<WordInfo>();List<String> mMoumList = new ArrayList<String>();List<String> mDoubleJaum = new ArrayList<String>();List<String> mDoubleMoum = new ArrayList<String>();private boolean mBroken = false;private int mRearWordCount = 0;private boolean mBrokedHistory;; public static void main(String[] args) { MakeCode mc = new MakeCode(); mc.start();} |
필요 변수를 선언하고 객체를 생성합니다.
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 | public MakeCode() { String moums = "yYuUiIoOpPhHjJkKlLbBnNmM"; String moum = ""; for (int i = 0; i < moums.length(); i++) { moum = moums.substring(i, i + 1); mMoumList.add(moum); } mDoubleJaum.add("rt"); // ㄳ mDoubleJaum.add("sw"); // ㄵ mDoubleJaum.add("sg"); // ㄶ mDoubleJaum.add("fr"); // ㄺ mDoubleJaum.add("fa"); // ㄻ mDoubleJaum.add("fq"); // ㄼ mDoubleJaum.add("ft"); // ㄽ mDoubleJaum.add("fx"); // ㄾ mDoubleJaum.add("fv"); // ㄿ mDoubleJaum.add("fg"); // ㅀ mDoubleJaum.add("qt"); // ㅄ mDoubleMoum.add("hk"); // ㅘ mDoubleMoum.add("ho"); // ㅙ mDoubleMoum.add("hl"); // ㅚ mDoubleMoum.add("nj"); // ㅝ mDoubleMoum.add("np"); // ㅞ mDoubleMoum.add("nl"); // ㅟ mDoubleMoum.add("ml"); // ㅢ} |
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | private void start() { // TODO Auto-generated method stub // read BufferedReader br = null; try { br = new BufferedReader(new FileReader("words.txt")); StringBuilder sb = new StringBuilder(); String line = br.readLine(); while (line != null) { boolean bAdd = false; int leng = getKoreanLength(line); if (hasBroken() || leng >= 3){ bAdd = true; } else { line = br.readLine(); continue; } mWordList.add(new WordInfo(line, leng)); mWords.put(line,leng); // 앞글자 대문자 변환 line = Character.toUpperCase(line.charAt(0)) + line.substring(1); leng = getKoreanLength(line); mWordList.add(new WordInfo(line, leng)); mWords.put(line,leng); line = br.readLine(); } } catch (Exception e) { } finally { try { br.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // write try { // ////////////////////////////////////////////////////////////// BufferedWriter out = new BufferedWriter(new FileWriter("out.txt")); for (WordInfo wi : mWordList) { String key = wi.mWord; int cnt = wi.mCnt; out.write(":*:"+key+"::\n"); out.write(" E("+cnt+")\n"); out.write(" return\n"); } // for (Entry<String, Integer> entry : sortedMap.entrySet()) {// String key = entry.getKey();// Integer cnt = entry.getValue();// // out.write(":*:"+key+"::\n");// out.write(" WRITE_IN_ENGLISH(\""+key+"\", "+cnt+")\n");// out.write(" return\n");// } // String s = "출력 파일에 저장될 이런 저런 문자열입니다.";//// out.write(s);// out.newLine();// out.write(s);// out.newLine(); out.close(); // ////////////////////////////////////////////////////////////// } catch (IOException e) { System.err.println(e); // 에러가 있다면 메시지 출력 System.exit(1); } } |
단어 파일을 읽어서, 하나씩 분석하고, 파일에 저장합니다.
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | public int getKoreanLength(String line) { mBrokedHistory = false; // 기존에 변경된 문자가 있는가? int longest = getLongestSameWord(line); // 기중에서 가장 긴 문자, 이후의 한글 수를 찾아야 함. String korWord = line.substring(longest); mRearWordCount = 0; String lastChar = ""; STATE next = STATE.CHOSUNG; for (String stroke : korWord.split("")) { if (next == STATE.CHOSUNG) { if (isMoum(stroke)) { next = STATE.JUNGSUNG_DOUBLE; setBroken(); } else { next = STATE.CHOSUNG_DOUBLE; } } else if (next == STATE.CHOSUNG_DOUBLE) { if (isMoum(stroke)) { next = STATE.JUNGSUNG_DOUBLE; } else if (isDoubleJaum(lastChar, stroke)) { next = STATE.JUNGSUNG; } else { setBroken(); addLength(); next = STATE.CHOSUNG_DOUBLE; } } else if (next == STATE.JUNGSUNG_DOUBLE) { if (isDoubleMoum(lastChar, stroke)) { if (isBroken()) { next = STATE.CHOSUNG; addLength(); } else { next = STATE.JONGSUNG; } } else if (isMoum(stroke)) { addLength(); setBroken(); next = STATE.JUNGSUNG_DOUBLE; } else { if (isBroken()) { addLength(); next = STATE.CHOSUNG_DOUBLE; } else { next = STATE.JONGSUNG_DOUBLE; } } } else if (next == STATE.JUNGSUNG) { if (isMoum(stroke)) { next = STATE.JUNGSUNG_DOUBLE; } else { addLength(); next = STATE.JUNGSUNG; } } else if (next == STATE.JONGSUNG) { if (isMoum(stroke)) { addLength(); setBroken(); next = STATE.JUNGSUNG_DOUBLE; } else { next = STATE.JONGSUNG_DOUBLE; } } else if (next == STATE.JONGSUNG_DOUBLE) { if (isMoum(stroke)) { addLength(); next = STATE.JUNGSUNG_DOUBLE; } else { // 이전 값이 같이 쓸 수 있는 자음인가? if (isDoubleJaum(lastChar, stroke)) { next = STATE.CHOSUNG; addLength(); } else { next = STATE.JUNGSUNG; addLength(); } } } lastChar = stroke; } if (next != STATE.CHOSUNG) { addLength(); } System.out.println(line + "\tSplit:" + longest + ":" + korWord + "\tCNT:" + mRearWordCount); return longest + mRearWordCount;}private boolean isBroken() { return mBroken;} |
각 글자 하나씩 읽어서, 한글일 경우의 상태값을 기록하면서 몇 글자로 입력이 되었는지 판단합니다.
STATE.java
words.TXT
댓글