在业务中,有一个场景,A系统需要提供一个接口,返回组织架构信息,供B系统入库,即B系统的组织架构是从A系统中同步过来的。
这个场景下存在一个小问题,B系统期望A系统按照组织树层序遍历分页返回。这样B系统就不需要担心新增组织时找不到父级组织了。
那么A系统要怎么做呢?
方案1:在数据库查询时,从根节点递归查询。
方案2:获取全部组织数据后,构建形成多叉树,常驻内存,然后从根节点层序遍历。
如果既不能直接查询数据库,又不想维护多叉树,怎么办呢?
下面的方案也许可以参考:
1、分页获取无序的组织list,并整合成golang的切片
2、从根节点出发,通过程序实现数据库的递归查询
示例如下:
package tree
import "fmt"
type node struct {
Id string `json:"id"`
Name string `json:"name"`
Pid string `json:"pid"`
}
var data = make([]node, 0, 10)
func SliceTreeSort() {
makeSliceTreeData()
// 输出排好序的结果
fmt.Println("排序前:")
for _, v := range data {
fmt.Println(v.Id, v.Name, v.Pid)
}
// 记录元素的索引的顺序
IdxSort := make([]int, 0, len(data))
// IdxSort的辅助变量,帮助判断索引是否已经在IdxSort存在
idxSet := make(map[int]bool, len(data))
// 记录已经处理过的Pid集合
pidSet := make(map[string]bool, len(data))
// 根节点默认已经处理过了
pidSet[`-1`] = true
// 遍历寻找
for i := 0; i < len(data); i++ {
// 如果IdxSort已经满了,说明已经排好序了
if len(idxSet) == len(data) {
break
}
for k, v := range data {
// 已记录的节点,不需要处理了
if _, ok := idxSet[k]; ok {
continue
}
// 判断当前节点的父节点是否在pidSet,在说明可以取v.Pid下所有的子节点,孙子、曾孙等节点还不能取
if _, ok := pidSet[v.Pid]; ok {
pidSet[v.Id] = true // 取子节点,为下次判断子节点的子节点做准备
IdxSort = append(IdxSort, k) // 记录子节点的索引
idxSet[k] = true // 标记子节点已经记录
}
}
}
// 按照上边idxSort计算的切片key顺序,重新排序
outData := make([]node, 0, len(data))
for _, v := range IdxSort {
outData = append(outData, data[v])
}
// 如果是分页对外提供接口,则可以讲切片缓存下来。
// 根据分页信息截切
fmt.Println("排序后:")
fmt.Println(outData)
}
func makeSliceTreeData() {
var n node
n = node{Id: "0", Name: "公司", Pid: "-1"}
data = append(data, n)
n = node{Id: "1000131", Name: "部门1-3-1", Pid: "100013"}
data = append(data, n)
n = node{Id: "1000132", Name: "部门1-3-2", Pid: "100013"}
data = append(data, n)
n = node{Id: "1000133", Name: "部门1-3-3", Pid: "100013"}
data = append(data, n)
n = node{Id: "10001", Name: "部门1", Pid: "0"}
data = append(data, n)
n = node{Id: "10002", Name: "部门2", Pid: "0"}
data = append(data, n)
n = node{Id: "10003", Name: "部门3", Pid: "0"}
data = append(data, n)
n = node{Id: "1000121", Name: "部门1-2-1", Pid: "100012"}
data = append(data, n)
n = node{Id: "1000122", Name: "部门1-2-2", Pid: "100012"}
data = append(data, n)
n = node{Id: "1000123", Name: "部门1-2-3", Pid: "100012"}
data = append(data, n)
n = node{Id: "1000111", Name: "部门1-1-1", Pid: "100011"}
data = append(data, n)
n = node{Id: "1000112", Name: "部门1-1-2", Pid: "100011"}
data = append(data, n)
n = node{Id: "1000113", Name: "部门1-1-3", Pid: "100011"}
data = append(data, n)
n = node{Id: "100011", Name: "部门1-1", Pid: "10001"}
data = append(data, n)
n = node{Id: "100012", Name: "部门1-2", Pid: "10001"}
data = append(data, n)
n = node{Id: "100013", Name: "部门1-3", Pid: "10001"}
data = append(data, n)
}
标签:node,Name,组分,Pid,员工,golang,data,Id,append
From: https://www.cnblogs.com/zhimajiang/p/18047711