lookforSegment method
查找本节点下对应的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;
}