分詞器代碼
1 package www.ygh.fenciqiUtils; 2 3 import java.io.FileReader; 4 import java.util.ArrayList; 5 import java.util.IdentityHashMap; 6 import java.util.List; 7 import java.util.Map; 8 import java.util.Set; 9 10 /** 11 * 最終返回的結果: 12 * 1:表示關鍵字 13 * 2:普通的非關鍵字符串 14 * 3:整數(暫不支持小數) 15 * 4:運算符 16 * 5:分隔符 17 * @author Administrator 18 * 19 */ 20 public class CFenCiQi { 21 // 初始化集合list1,用於存在關鍵字 22 private List<String> list1 = new ArrayList<String>(); 23 24 // 定義集合list4,用於存放運算符號 25 private List<String> list4 = new ArrayList<String>(); 26 27 // 定義集合list5,用於存放分用於存放分隔符號 28 private List<String> list5 = new ArrayList<String>(); 29 30 // 定義集合list3 31 private List<String> list3 = new ArrayList<String>(); 32 33 //"C:\\Users\\Administrator\\Desktop\\test_c.c" 34 private String filePath; 35 36 private List<Map<String, String>> mapList = new ArrayList<Map<String, String>>(); 37 38 private int temp = 0; 39 40 private int match_1 = 0; 41 42 private int match_4 = 0; 43 44 private int match_3 = 0; 45 46 private int ch = 0; 47 private String str1 = ""; 48 49 public CFenCiQi(String filePath) { 50 this.filePath = filePath; 51 } 52 53 54 55 public CFenCiQi() { 56 57 } 58 59 60 /** 61 * 初始化關鍵字,運算符,分隔符等list集合 62 */ 63 public void init() { 64 65 // 初始化集合list1,用於存在關鍵字 66 list1.add("if"); 67 list1.add("int"); 68 list1.add("for"); 69 list1.add("while"); 70 list1.add("do"); 71 list1.add("return"); 72 list1.add("break"); 73 list1.add("continue"); 74 75 // 初始化集合list4,用於存放運算符號 76 list4.add("+"); 77 list4.add("-"); 78 list4.add("*"); 79 list4.add("/"); 80 list4.add("="); 81 list4.add(" "); 82 list4.add("<"); 83 list4.add(" ="); 84 list4.add("<="); 85 list4.add("!="); 86 87 // 初始化集合list5,用於存放分隔符號 88 list5.add(","); 89 list5.add(";"); 90 list5.add("{"); 91 list5.add("}"); 92 list5.add("("); 93 list5.add(")"); 94 95 // 初始化集合list3,用於存放數組字符 96 list3.add("0"); 97 list3.add("1"); 98 list3.add("2"); 99 list3.add("3"); 100 list3.add("4"); 101 list3.add("5"); 102 list3.add("6"); 103 list3.add("7"); 104 list3.add("8"); 105 list3.add("9"); 106 107 } 108 109 /** 110 * 判斷字符是否和運算符匹配 111 * @param c 112 * @return 113 */ 114 public boolean match_2(String c) { 115 for (String str : list4) { 116 if (c.equals(str)) { 117 return true; 118 } 119 } 120 return false; 121 } 122 123 /** 124 * 判斷字符是否和分隔符匹配 125 * @param c 126 * @return 127 */ 128 public boolean match_4(String c) { 129 for (String str : list5) { 130 if (c.equals(str)) { 131 return true; 132 } 133 } 134 return false; 135 } 136 137 /** 138 * 判斷讀取的字符是否和數字匹配 139 * @param c 140 * @return 141 */ 142 public boolean match_3(String c) { 143 for (String str : list3) { 144 if (c.equals(str)) { 145 return true; 146 } 147 } 148 return false; 149 } 150 151 /** 152 * 進行分詞 153 * @throws Exception 154 */ 155 public void getFenCi() throws Exception { 156 157 158 //讀取文件的路徑 159 FileReader fileReader = new FileReader(filePath); 160 //挨個讀取字符 161 while ((ch = fileReader.read()) != -1) { 162 163 char c = (char) ch; 164 if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z') { 165 166 if (match_4 == 1) { 167 matchEqual_4(); 168 } 169 170 if (match_3 == 1) { 171 matchEqual_3(); 172 } 173 174 str1 = str1 + c; 175 match_1 = 1; 176 177 } else if (match_4(c + "")) { 178 if(match_1==1){ 179 matchEqual_1(); 180 } 181 182 if (match_4 == 1) { 183 matchEqual_4(); 184 185 } 186 187 if (match_3 == 1) { 188 matchEqual_3(); 189 } 190 191 str1 = ""; 192 str1 = str1 + c; 193 setValue("5", str1); 194 str1 = ""; 195 196 } else if (match_2(c + "")) { 197 if(match_1==1){ 198 matchEqual_1(); 199 } 200 201 if (match_3 == 1) { 202 matchEqual_3(); 203 } 204 205 str1 = str1 + c; 206 match_4 = 1; 207 208 } else if (match_3(c + "")) { 209 if(match_1==1){ 210 matchEqual_1(); 211 } 212 213 if (match_4 == 1) { 214 matchEqual_4(); 215 } 216 217 str1 = str1 + c; 218 match_3 = 1; 219 } 220 } 221 fileReader.close(); 222 } 223 224 /** 225 * 設置集合裡面的值 226 * @param id 227 * @param value 228 */ 229 public void setValue(String id, String value) { 230 Map<String, String> fenci = new IdentityHashMap<String, String>(); 231 fenci.put(id, value); 232 mapList.add(fenci); 233 } 234 235 public void matchEqual_1() { 236 temp = 0; 237 for (String str : list1) { 238 if (str.equals(str1)) { 239 setValue("1", str1); 240 temp = 1; 241 break; 242 } 243 } 244 245 if (temp == 0) { 246 setValue("2", str1); 247 } 248 249 match_1 = 0; 250 str1 = ""; 251 } 252 253 /** 254 * 字符串為數字的處理方法 255 */ 256 public void matchEqual_3() { 257 setValue("3", str1); 258 match_3 = 0; 259 str1 = ""; 260 } 261 262 /** 263 * 字符串為運算符的處理方法 264 */ 265 public void matchEqual_4() { 266 setValue("4", str1); 267 match_4 = 0; 268 str1 = ""; 269 } 270 271 272 /** 273 * 使用默認的分詞器,默認支持c語言 274 * @return 275 * @throws Exception 276 */ 277 public List<Map<String, String>> getResult() throws Exception { 278 //如果沒有實現自定義分詞,那麼就使用默認分詞,如果有,實現自定義分詞 279 if(this.list1==null || this.list4==null || this.list5 ==null){ 280 init(); 281 } 282 getFenCi(); 283 return this.mapList; 284 } 285 286 287 /** 288 * 對封裝的分詞結果進行專業的toSting 289 * @param mapList1 290 */ 291 public static void getString(List<Map<String, String>> mapList1){ 292 for(Map<String, String> map:mapList1){ 293 Set<String> keySet = map.keySet(); 294 for(String key:keySet){ 295 System.out.print("{"+key+"-->"+map.get(key)+"}"); 296 } 297 System.out.print(","); 298 } 299 System.out.println(); 300 } 301 302 /** 303 * 設置需要分詞源文件的路徑 304 * @param filePath 305 */ 306 public void setFilePath(String filePath) { 307 this.filePath = filePath; 308 } 309 310 /** 311 * 指定分詞的關鍵字,運算符和分隔符,幫你分詞 312 * @param keyList 指定關鍵字的集合 313 * @param calculateList 指定運算符集合 314 * @param sperateList 指定分隔符集合 315 */ 316 public void setDefaultParam(List<String> keyList,List<String> calculateList,List<String> separateList){ 317 this.list1 = keyList; 318 this.list4 = calculateList; 319 this.list5 = separateList; 320 } 321 322 323 324 }
分詞器測試代碼
package www.ygh.test; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.junit.Test; import www.ygh.fenciqiUtils.CFenCiQi; public class Test_FenCiQi { // 初始化集合list1,用於存在關鍵字 private List<String> list1 = new ArrayList<String>(); // 定義集合list4,用於存放運算符號 private List<String> list4 = new ArrayList<String>(); // 定義集合list5,用於存放分用於存放分隔符號 private List<String> list5 = new ArrayList<String>(); // c語言源代碼路徑 public String filePath = "C:\\Users\\Administrator\\Desktop\\test_c.c"; // java語言源代碼路徑 public String filePath2 = "C:\\Users\\Administrator\\Desktop\\fenci.java"; /** * 使用系統默認的分詞,只支持c語言 * * @throws Exception */ @Test public void test_1() throws Exception { // 創建分詞器對象 CFenCiQi cFenCiQi = new CFenCiQi(); // 設置源代碼路徑 cFenCiQi.setFilePath(filePath); // 進行分詞,並且獲取結果 List<Map<String, String>> mapList = cFenCiQi.getResult(); System.out.println(mapList.size()); CFenCiQi.getString(mapList); } /** * 測試自定義的c語言分詞 * * @throws Exception */ @Test public void test_2() throws Exception { //初始化c語言的分詞條件 fun1(); // 創建分詞器對象 CFenCiQi cFenCiQi = new CFenCiQi(); //把自定義的分詞條件傳入 cFenCiQi.setDefaultParam(list1, list4, list5); //傳入源代碼路徑 cFenCiQi.setFilePath(filePath); List<Map<String, String>> mapList = cFenCiQi.getResult(); CFenCiQi.getString(mapList); } /** * 測試自定義的java的分詞 * * @throws Exception */ @Test public void test_3() throws Exception { fun2(); CFenCiQi cFenCiQi = new CFenCiQi(); cFenCiQi.setDefaultParam(list1, list4, list5); cFenCiQi.setFilePath(filePath2); List<Map<String, String>> mapList = cFenCiQi.getResult(); CFenCiQi.getString(mapList); } /** * 初始化c語言分詞條件 */ public void fun1() { // 初始化集合list1,用於存c語言在關鍵字 list1.add("if"); list1.add("int"); list1.add("for"); list1.add("while"); list1.add("do"); list1.add("return"); list1.add("break"); list1.add("continue"); // 初始化集合list4,用於c語言存放運算符號 list4.add("+"); list4.add("-"); list4.add("*"); list4.add("/"); list4.add("="); list4.add(" "); list4.add("<"); list4.add(" ="); list4.add("<="); list4.add("!="); // 初始化集合list5,用於存放c語言分隔符號 list5.add(","); list5.add(";"); list5.add("{"); list5.add("}"); list5.add("("); list5.add(")"); } /** * 初始化java的分詞條件 */ public void fun2() { // 初始化集合list1,用於存在java關鍵字 list1.add("if"); list1.add("int"); list1.add("for"); list1.add("while"); list1.add("do"); list1.add("return"); list1.add("break"); list1.add("public"); list1.add("class"); list1.add("void"); list1.add("list"); list1.add("out"); list1.add("static"); list1.add("new"); list1.add("char"); list1.add("private"); list1.add("this"); list1.add("import"); list1.add("package"); // 初始化集合list4,用於java存放運算符號 list4.add("+"); list4.add("-"); list4.add("*"); list4.add("/"); list4.add("="); list4.add(" "); list4.add("<"); list4.add(" ="); list4.add("<="); list4.add("!="); // 初始化集合list5,用於存放java分隔符號 list5.add(","); list5.add(";"); list5.add("{"); list5.add("}"); list5.add("("); list5.add(")"); } }
只是一個簡單的實現,還有很多不足的地方,希望大家幫忙提提意見,修改修改