/** * 匹配词段 * * @param charArray * @param begin * @param length * @param searchHit * @return Hit */ public Hit match(char[] charArray, int begin, int length, Hit searchHit) { if (searchHit == null) { // 如果hit为空,新建 searchHit = new Hit(); // 设置hit的其实文本位置 searchHit.setBegin(begin); } else { // 否则要将HIT状态重置 searchHit.setUnmatch(); } // 设置hit的当前处理位置 searchHit.setEnd(begin); Character keyChar = new Character(charArray[begin]); DictSegment ds = null; // 引用实例变量为本地变量,避免查询时遇到更新的同步问题 DictSegment[] segmentArray = this.childrenArray; Map<Character, DictSegment> segmentMap = this.childrenMap; // STEP1 在节点中查找keyChar对应的DictSegment if (segmentArray != null) { // 在数组中查找 for (DictSegment seg : segmentArray) { if (seg != null && seg.nodeChar.equals(keyChar)) { // 找到匹配的段 ds = seg; } } } else if (segmentMap != null) { // 在map中查找 ds = (DictSegment) segmentMap.get(keyChar); } // STEP2 找到DictSegment,判断词的匹配状态,是否继续递归,还是返回结果 if (ds != null) { if (length > 1) { // 词未匹配完,继续往下搜索 return ds.match(charArray, begin + 1, length - 1, searchHit); } else if (length == 1) { // 搜索最后一个char if (ds.nodeState == 1) { // 添加HIT状态为完全匹配 searchHit.setMatch(); } if (ds.hasNextNode()) { // 添加HIT状态为前缀匹配 searchHit.setPrefix(); // 记录当前位置的DictSegment searchHit.setMatchedDictSegment(ds); } return searchHit; } } // STEP3 没有找到DictSegment, 将HIT设置为不匹配 return searchHit; }