分词器代码
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(")"); } }
只是一个简单的实现,还有很多不足的地方,希望大家帮忙提提意见,修改修改