前缀树红点_第一章
指的是,包含相同字符串前缀的,树结构,定义参考前缀树即可; 弄一个struct结构体RangeString,继承自IEquatable泛型; 结构体主要用于,构造字符串,作为前缀树的key索引相关; 声明了源头的字符串、开始计算的字符串索引、结束计算的字符串索引、长度、判空、哈希码等变量;
构造函数,完成各变量的初始化
继承自IEquatable,其中必要的,就是Equals函数接口; 空字符、长度对比、还有基于索引 m_StartIndex 和 m_EndIndex ,对比字符,判断,源字符m_Source,对应索引的字符值,是否相等,判断返回true或false即可;
重写哈希值的逻辑,是遍历源字符串m_Source的索引,完成哈希值的重写逻辑
游戏运行时,会使用到ReddotMananger红点管理器的相关逻辑,完成红点前缀树逻辑的增删触发等逻辑,先弄一个,对应的Instance单例
其中有一个StringBuilder的字符串缓存器,会用于,范围字符串的Tostring重写
回到RangeString范围字符串,字符串的重写,也是基于,源字符串m_Source对应的Index索引,使用 红点管理器的 CachedSb字符串缓存器,完成构建重写即可
TreeNode是前缀树的,相关逻辑,其中有一个m_Children的字典容器,是以之前解析的RangeString范围字符串,作为key,TreeNode树节点,作为子value; 该TreeNode树节点,修改的函数回调,是m_ChangeCallback的Action回调,是红点数int的变更; m_FullPath完整路径,指的是,它在前缀树中的,完整字符索引路径,Name就是节点名;
Value就是对应的,该节点包含的,红点数值,Parent就是它对应的父节点
该TreeNode包含的,子节点Values集合
与之对应的,还有子节点,对应的总数,如果m_Children数据容器为空,直接返回0即可; 否则,就先把sum加上,自身包含的m_Children子节点集合,对应的Count数目; 然后,foreach遍历,子节点集合的node节点,sum再加上,它们的子节点ChildrenCount总数;
先回到ReddotMananger红点管理器,有声明3个节点集合,分别对应:所有可用的TreeNode前缀树节点,字典容器m_AllNodes、脏节点数据容器m_DirtyNodes,使用哈希HashSet确保,其中包含的TreeNode元素,唯一性,后续会用于,节点修改后,对应的关联,父节点,触发红点修改回调; 还有一个临时脏节点m_TempDirtyNodes数据容器,是配合上述m_DirtyNodes,完成缓冲,和后续的脏节点逻辑处理; 节点数量修改回调NodeNumChangeCallback、节点值改变回调NodeValueChangeCallback,是对应后续,触发,编辑器的参数显示,变更;
管理器还弄了一个char字符的SplitChar,作为前缀树,路径名称之间的,分隔符
还有一个Root根节点的设置、获取器
ReddotMananger红点管理器的,构造函数,完成各变量的初始化,完成了分隔符的定义是/
,根节点,也是new实例化一个TreeNode的对象即可,命名为"Root",还有几个数据容器、字符串缓存器的,初始化
管理器中,对应的MarkDirtyNode函数接口,就是将,对应的TreeNode节点,加到m_DirtyNodes脏节点数据容器中
回到TreeNode节点的逻辑类,其中FullPath完整路径,如果是Root根节点,直接把Name作为完整路径即可; 不 否则,就配合,父节点的FullPath完整路径 加上 SplitChar分隔符,再加上,自身Name,构建即可;