二维数组转目录结构:一种便捷高效的 go 语言算法
想要实现类似 rdm 的目录树结构?但苦思冥想却难有突破?别担心,这篇文章将为你提供一个简洁高效的 go 语言解决方案,帮你在复杂的数据中理出清晰的条理。
任务:将给定的二维数组转换为如 rdm 般的目录树结构。数组中元素由冒号(:)分隔,表示目录层级关系。
示例输入:
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",}
登录后复制
预期输出:
[ { "name": "answer", "child": [ { "name": "aa", "child": [ { "name": "bb", "value": "answer:aa:bb", "child": [] }, { "name": "cc", "value": "answer:aa:cc", "child": [] } ] } ] }, { "name": "question", "child": [ { "name": "book1", "value": "question:book1", "child": [ { "name": "answer", "child": [ { "name": "name1", "value": "question:book1:answer:name1", "child": [] }, { "name": "name2", "value": "question:book1:answer:name2", "child": [] } ] } ] } ] }, { "name": "timeout_1", "value": "timeout_1", "child": [] }, { "name": "timeout_2", "value": "timeout_2", "child": [] }]
登录后复制
算法步骤:
初始化一个根节点映射表 root。遍历给定的数组值。将数组值按冒号分隔为键列表 keys。按键列表的顺序遍历 root。如果遇到的键是现有子节点,则进入该子节点的映射表中;否则,创建一个新子节点并进入该子节点的映射表中。对于键列表中的最后一个键(表示叶子节点),创建一个只包含名称和值的节点,并将其添加到当前子节点映射表中。
最终代码:
package mainimport ( "encoding/json" "strings")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 } } t[value] = Node{ Name: keys[l-1], Value: value, Child: nil, } } r, _ := json.Marshal(root) println(string(r))}type Node struct { Name string Value string Child map[string]Node}
登录后复制
运用此算法,你可以轻而易举地实现任意复杂性的二维数组到目录树的转换,并生成清晰、美观的树状结构。
以上就是如何用 Go 语言将二维数组转化为类似 RDM 的目录树结构?的详细内容,更多请关注【创想鸟】其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。
发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2314876.html