match method

Hit match(
  1. List<String> charArray, [
  2. int begin = 0,
  3. int? length,
  4. Hit? searchHit,
])

匹配词段

@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;
}