我想用 table 做一棵树。
表格如下:

OrgID   OrgName        parentID
A001    Dept           0 -----th top
A002    subDept1        A001
A003    sub_subDept    A002
A006    gran_subDept   A003
A004    subDept2        A001

我希望结果如下,如何使用go进行操作:

部门

--subDept1

---- sub_subDept

------ gran_subDept

--subDept2

最佳答案

如果要将线解析为树结构,则可以使用以下方法:

package main

import (
    "bufio"
    "fmt"
    "io"
    "os"
    "strings"
)

type Node struct {
    name     string
    children []*Node
}

var (
    nodeTable = map[string]*Node{}
    root      *Node
)

func add(id, name, parentId string) {
    fmt.Printf("add: id=%v name=%v parentId=%v\n", id, name, parentId)

    node := &Node{name: name, children: []*Node{}}

    if parentId == "0" {
        root = node
    } else {

        parent, ok := nodeTable[parentId]
        if !ok {
            fmt.Printf("add: parentId=%v: not found\n", parentId)
            return
        }

        parent.children = append(parent.children, node)
    }

    nodeTable[id] = node
}

func scan() {
    input := os.Stdin
    reader := bufio.NewReader(input)
    lineCount := 0
    for {
        lineCount++
        line, err := reader.ReadString('\n')
        if err == io.EOF {
            break
        }
        if err != nil {
            fmt.Printf("error reading lines: %v\n", err)
            return
        }
        tokens := strings.Fields(line)
        if t := len(tokens); t != 3 {
            fmt.Printf("bad input line %v: tokens=%d [%v]\n", lineCount, t, line)
            continue
        }
        add(tokens[0], tokens[1], tokens[2])
    }
}

func showNode(node *Node, prefix string) {
    if prefix == "" {
        fmt.Printf("%v\n\n", node.name)
    } else {
        fmt.Printf("%v %v\n\n", prefix, node.name)
    }
    for _, n := range node.children {
        showNode(n, prefix+"--")
    }
}

func show() {
    if root == nil {
        fmt.Printf("show: root node not found\n")
        return
    }
    fmt.Printf("RESULT:\n")
    showNode(root, "")
}

func main() {
    fmt.Printf("main: reading input from stdin\n")
    scan()
    fmt.Printf("main: reading input from stdin -- done\n")
    show()
    fmt.Printf("main: end\n")
}

10-08 02:35