
二维数组转目录结构算法
要实现类似 rdm 的目录树结构,一个高效的方法是遍历输入的键值数组,并根据冒号分隔的键来添加节点。算法如下:
创建一个根节点,初始化为空映射。
遍历键值数组。
对于每个键值对:
从根节点开始构建路径。
对于路径中每个键:
如果存在对应子节点,则进入该子节点。
否则,创建该子节点并将其添加到当前节点。
将键值对作为叶子节点添加到当前节点。将结果映射序列化为 json 字符串。
以下是该算法的 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 {
// 将字符串按冒号分隔。
keys := strings.Split(value, ":")
// 获取数组长度。
l := len(keys)
// 从根节点开始构建路径。
t := root
// 遍历除最后一个外的所有键。
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
}
}
// 将最后一个键作为叶子节点添加到当前节点。
t[value] = Node{
Name: keys[l-1],
Value: value,
Child: nil,
}
}
// 将结果映射序列化为 JSON 字符串。
r, _ := json.Marshal(root)
println(string(r))
}以上就是如何利用二维数组构建类似 RDM 的目录树结构?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号