lookforSegment method

DictSegment? lookforSegment(
  1. String keyChar,
  2. int create
)

查找本节点下对应的keyChar的segment *

@param keyChar @param create =1如果没有找到,则创建新的segment ; =0如果没有找到,不创建,返回null @return

Implementation

DictSegment? lookforSegment(String keyChar, int create) {
  DictSegment? ds;

  if (storeSize <= ARRAY_LENGTH_LIMIT) {
    // 获取数组容器,如果数组未创建则创建数组
    List<DictSegment> segmentArray = getChildrenArray();
    // 搜寻数组
    DictSegment keySegment = DictSegment(keyChar);
    int position =
        binarySearch(segmentArray, keySegment, start: 0, end: storeSize);
    if (position >= 0) {
      ds = segmentArray[position];
    }

    // 遍历数组后没有找到对应的segment
    if (ds == null && create == 1) {
      ds = keySegment;
      if (storeSize < ARRAY_LENGTH_LIMIT) {
        // 数组容量未满,使用数组存储
        segmentArray[storeSize] = ds;
        // segment数目+1
        storeSize++;

        mergeSort(segmentArray, start: 0, end: storeSize);
      } else {
        // 数组容量已满,切换Map存储
        // 获取Map容器,如果Map未创建,则创建Map
        Map<String, DictSegment> segmentMap = getChildrenMap();
        // 将数组中的segment迁移到Map中
        migrate(segmentArray, segmentMap);
        // 存储新的segment
        segmentMap[keyChar] = ds;
        // segment数目+1 , 必须在释放数组前执行storeSize++ , 确保极端情况下,不会取到空的数组
        storeSize++;
        // 释放当前的数组引用
        childrenArray = null;
      }
    }
  } else {
    // 获取Map容器,如果Map未创建,则创建Map
    Map<String, DictSegment> segmentMap = getChildrenMap();
    // 搜索Map
    ds = segmentMap[keyChar];
    if (ds == null && create == 1) {
      // 构造新的segment
      ds = DictSegment(keyChar);
      segmentMap[keyChar] = ds;
      // 当前节点存储segment数目+1
      storeSize++;
    }
  }

  return ds;
}