
二维数组转目录结构算法
要创建一个类似 rdm 的目录树,需要将给定的二维数组转换为一个层次结构。以下算法可以高效地执行此操作:
- 创建一个空映射,这将是树的根节点。
-
对于数组中的每个值:
- 将该值拆分为带有冒号 ":" 分隔符的密钥。
- 从根节点开始,跟随密钥遍历树。
-
对于遇到的每个密钥(除最后一个):
- 如果存在子节点,则将子节点映射为当前节点。
- 如果子节点不存在,则创建一个带有空子节点映射的新节点。
- 将最后一个键作为叶子节点添加到当前节点的子节点映射中。
以下 go 代码实现了此算法:
package main
import (
"encoding/json"
"strings"
)
var values = []string{
"answer:aa:bb",
"answer:aa:cc",
"question:book1",
"question:book1:answer",
"question:book1:answer:name1",
"question:book1:answer:name2",
"timeout_1",
"timeout_2",
}
type Node struct {
Name string
Value string
Child map[string]Node
}
func main() {
root := make(map[string]Node)
for _, value := range values {
t := root
// 根据 : 拆分字符串
keys := strings.Split(value, ":")
l := len(keys)
for i := 0; i < l-1; i++ {
k := keys[i]
if tm, has := t[k]; has {
// 复用并进入下一层节点
t = tm.Child
} else {
// 新建并进入下一层节点
t[k] = Node{
Name: k,
Child: map[string]Node{},
}
t = t[k].Child
}
}
// 为最后一个 key 时 单独处理成叶子节点
t[value] = Node{
Name: keys[l-1],
Value: value,
Child: nil,
}
}
r, _ := json.Marshal(root)
println(string(r))
}










