【发布时间】:2019-12-23 04:40:57
【问题描述】:
我正在尝试将 Go 中的节点列表转换为图形表示。 这个例子是一个 1
节点定义如下:
type Node struct {
Name string `json:"name"`
UUID string `json:"uuid"`
ParentUUID string `json:"parentUuid"`
ParentName string `json:"parentName"`
Node []Node
}
这是我目前的实现
func BuildTree(nodeList []models.Node) []models.Node {
//build hashmap with reference to all nodes in the list
nodeHashMap := make(map[string]NodeHash)
for index, node := range nodeList {
nodeHash := NodeHash{}
nodeHash.NodeRef = &nodeList[index]
nodeHash.Uid = node.UUID
if len(node.ParentUUID) == 0 {
nodeHash.IsParent = true
}
nodeHashMap[node.UUID] = nodeHash
}
//link all the nodes with parent nodes
for _, node := range nodeList {
if len(node.ParentUUID) != 0 {
if parentHashNode, ok := nodeHashMap[node.ParentUUID]; ok {
parentNodeRef := parentHashNode.NodeRef
parentNodeRef.Node = append(parentNodeRef.Node, node)
}
}
}
//build a new list with only the parent nodes which is like the "root" level for the graph
newNodeList := []models.Node{}
for _, v := range nodeHashMap {
if v.IsParent {
newNodeList = append(newNodeList, *v.NodeRef)
}
}
return newNodeList
}
我正在尝试这样调用此方法:
node1 := models.Node{UUID:"1",Name: "parent"}
node2 := models.Node{UUID:"2",Name: "child",ParentUUID:"1"}
node3 := models.Node{UUID:"3",Name: "grandchild",ParentUUID:"2"}
nodeList := []models.Node{}
nodeList = append(nodeList,node1)
nodeList = append(nodeList,node2)
nodeList = append(nodeList,node3)
nodeTreeList := BuildTree(nodeList)
【问题讨论】:
-
对不起..它完成了!
-
您改进了缩进,但代码仍然非常难看/难以阅读。请使用
goftmt。我为你做了更多的修饰。 -
使用 gofmt 更新。