登录
首页 >  Golang >  Go问答

将平面列表中带有父字段的对象转换为 Golang 中的嵌套树状结构

来源:stackoverflow

时间:2024-02-19 09:45:13 210浏览 收藏

从现在开始,努力学习吧!本文《将平面列表中带有父字段的对象转换为 Golang 中的嵌套树状结构》主要讲解了等等相关知识点,我会在golang学习网中持续更新相关的系列文章,欢迎大家关注并积极留言建议。下面就先一起来看一下本篇正文内容吧,希望能帮到你!

问题内容

如果我有一个 employeenode 结构的平面数组,每个结构都有一个 reportto 字段,那么如何创建一个树状结构,其中树的根由 employeenode 结构表示,而 children 字段包含一个 employeenode 列表向根节点报告?例如,给定以下输入,如何转换为根 employeenode 结构?

type employeenode struct {
    username string 
    reportto string 
    children   []employeenode 
}
var input []employeenode = [
{
   username: "bob wang",
   reportto: "",
   children: []employeenode{}
},
{
   username: "jim halpert",
   reportto: "bob wang",
   children: []employeenode{}
},
{
   username: "brett wang",
   reportto: "jim halpert",
   children: []employeenode{}
},
{
   username: "ryan wang",
   reportto: "jim halpert",
   children: []employeenode{},
},
{
   username: "michael wang",
   reportto: "bob wang",
   children: []employeenode{}
},
{
   username: "annie wang",
   reportto: "michael wang",
   children: []employeenode{}
}, 
{
   username: "jay wang",
   reportto: "michael wang",
   children: []employeenode{}
},
]
// Expected result
var root EmployeeNode = EmployeeNode{
    UserName: "Bob Wang",
    ReportTo: "",
    Children: []EmployeeNode{
        EmployeeNode{
            UserName: "Jim Halpert",
            ReportTo: "Bob Wang",
            Children: [
                EmployeeNode{
                    UserName: "Brett Wang",
                    ReportTo: "Jim Halpert",
                    Children: []EmployeeNode{},
                },
                EmployeeNode{
                    UserName: "Ryan Wang",
                    ReportTo: "Jim Halpert",
                    Children: []EmployeeNode{},
                },
            ]
        },
        EmployeeNode{
            UserName: "Michael Wang",
            ReportTo: "Bob Wang",
            Children: [
                EmployeeNode{
                    UserName: "Annie Wang",
                    ReportTo: "Michael Wang",
                    Children: []EmployeeNode{},
                },
                EmployeeNode{
                    UserName: "Jay Wang",
                    ReportTo: "Michael Wang",
                    Children: []EmployeeNode{},
                },
            ]
        },
    },
}

正确答案


这样的事情应该对你有用:

func list2tree(employees []EmployeeNode) EmployeeNode {

  // a map, to keep track of each individual subtree.
  // Using a pointer to the EmployeeInfo struct so as to ensure that there's
  // only a single copy of each struct.
  subtrees := map[string]*EmployeeNode{}
  
  // populate the map: every node is the root of its own subtree
  for _, emp := range employees {
    subtrees[emp.ReportTo] = &emp
  }
  
  // iterate over the list of employees
  for _, emp := range employees {
    
    // if this is not the root node, she reports to somebody
    if emp.ReportTo != "" {
    
      // look up their immediate manager
      subtree := subtrees[emp.ReportTo]
      
      // add them as a direct report
      subtree.Children = append(subtree.Children, emp)
      
    }

  }

  // At the end of the day, now, the tree is fully populated
  // return the root node for the entire tree
  return *subtrees[""]
}

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>