match method
匹配词段
@param charArray @param begin @param length @param searchHit @return Hit
Implementation
Hit match(List<String> charArray,
[int begin = 0, int? length, Hit? searchHit]) {
length ??= charArray.length;
if (searchHit == null) {
// 如果hit为空,新建
searchHit = Hit();
// 设置hit的其实文本位置
searchHit.setBegin(begin);
} else {
// 否则要将HIT状态重置
searchHit.setUnmatch();
}
// 设置hit的当前处理位置
searchHit.setEnd(begin);
String keyChar = charArray[begin];
DictSegment? ds;
// 引用实例变量为本地变量,避免查询时遇到更新的同步问题
List<DictSegment?>? segmentArray = childrenArray;
Map<String, DictSegment>? segmentMap = childrenMap;
// STEP1 在节点中查找keyChar对应的DictSegment
if (segmentArray != null) {
// 在数组中查找
DictSegment keySegment = DictSegment(keyChar);
int position =
binarySearch(segmentArray, keySegment, start: 0, end: storeSize);
if (position >= 0) {
ds = segmentArray[position];
}
} else if (segmentMap != null) {
// 在map中查找
ds = segmentMap[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;
}