如何用 Go 语言将二维数组转化为类似 RDM 的目录树结构?

如何用 go 语言将二维数组转化为类似 rdm 的目录树结构?

二维数组转目录结构:一种便捷高效的 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

(0)
上一篇 2025年2月28日 14:13:07
下一篇 2025年2月26日 02:29:01

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论