如何将路径列表高效转换为嵌套Map结构(Dart)
将路径列表转换为嵌套Map的高性能实现(Dart)
需求说明
输入路径列表:
[ "animal/cat/persian", "animal/cat/british_shorthair", "animal/dog/pug", "animal/dog/pitbull", "vehicle/car/mercedes", "vehicle/car/bmw" ]
需要转换为如下嵌套Map结构:
{ 'animal': { 'cat': { 'Persian': {}, 'British_Shorthair': {} }, 'dog': { 'Pug': {}, 'Pitbull': {} } }, 'vehicle': { 'car': { 'Mercedes': {}, 'BMW': {} } }
要求路径长度不固定、支持无限嵌套,且实现需保证高性能。
实现思路
核心思路是遍历每个路径并逐步构建嵌套节点,复用已存在的Map对象避免重复创建,以此保证高性能:
- 初始化空的根Map作为结果容器
- 对每个路径按
/分割为多个段 - 从根Map开始,依次遍历每个路径段:
- 将路径段转换为目标命名格式(下划线分隔转首字母大写的驼峰)
- 检查当前Map是否存在该键对应的节点:存在则直接进入该节点;不存在则创建新的空Map并加入当前节点,再进入新节点
- 处理完所有路径段后,得到完整嵌套Map
代码实现
Map<String, dynamic> buildNestedMap(List<String> paths) { final root = <String, dynamic>{}; for (final path in paths) { final segments = path.split('/'); var currentMap = root; for (var i = 0; i < segments.length; i++) { var segment = segments[i]; // 转换命名格式:下划线分割后每个词首字母大写,再用下划线拼接 final formattedKey = segment.split('_').map((word) => word.isNotEmpty ? '${word[0].toUpperCase()}${word.substring(1)}' : '' ).join('_'); // 不存在对应节点则创建新空Map if (!currentMap.containsKey(formattedKey)) { currentMap[formattedKey] = <String, dynamic>{}; } // 移动到下一层节点 currentMap = currentMap[formattedKey] as Map<String, dynamic>; } } return root; } // 使用示例 void main() { final paths = [ "animal/cat/persian", "animal/cat/british_shorthair", "animal/dog/pug", "animal/dog/pitbull", "vehicle/car/mercedes", "vehicle/car/bmw" ]; final nestedMap = buildNestedMap(paths); print(nestedMap); }
性能说明
该实现时间复杂度为O(N),其中N是所有路径的总段数。每个路径段仅被处理一次,哈希表的节点创建和访问操作均为O(1),无冗余遍历或重复计算,能高效处理大量路径和深度嵌套场景。
内容的提问来源于stack exchange,提问作者Charitarth Chugh
相关产品推荐
相关产品推荐

