1 Star 0 Fork 0

hongzhaomin / hzm-common-go

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
tree.go 2.17 KB
一键复制 编辑 原始数据 按行查看 历史
hongzm 提交于 2023-07-20 11:07 . tree优化
package structure
import (
"gitee.com/hongzhaomin/hzm-common-go/streams"
"reflect"
)
type HzmTree[T comparable] interface {
GetId() T
GetParentId() T
AddChildren(...HzmTree[T])
//AddChildren([]HzmTree[T])
}
type BaseTree[T comparable] struct {
Id T
ParentId T
Children []HzmTree[T]
}
var _ HzmTree[any] = (*BaseTree[any])(nil)
func (b *BaseTree[T]) GetId() T {
return b.Id
}
func (b *BaseTree[T]) GetParentId() T {
return b.ParentId
}
func (b *BaseTree[T]) AddChildren(children ...HzmTree[T]) {
b.Children = append(b.Children, children...)
}
func BuildTree[T comparable, N HzmTree[T]](nodes []N) []N {
if nodes == nil {
return nil
}
notRoots := streams.OfSlice(nodes).Filter(isNotRoot[T, N]).ToSlice()
parentId2NodesMap := streams.GroupingByIdentity(notRoots, func(node N) T {
return node.GetParentId()
})
roots := streams.OfSlice(nodes).Filter(isRoot[T, N]).ToSlice()
fillTree(roots, parentId2NodesMap)
return roots
}
func isRoot[T comparable, N HzmTree[T]](node N) bool {
return reflect.ValueOf(N.GetParentId(node)).IsZero()
}
func isNotRoot[T comparable, N HzmTree[T]](node N) bool {
return !isRoot[T](node)
}
func fillTree[T comparable, N HzmTree[T]](nodes []N, parentId2NodesMap map[T][]N) {
for _, node := range nodes {
id := N.GetId(node)
if children, ok := parentId2NodesMap[id]; ok {
// 这里新建一个切片主要是为了将children的元素类型转化为HzmTree[T]类型
// 没办法,因为go语言不像Java,切片类型无法自动转换过去,即使元素类型一致
//childrenSlice := make([]HzmTree[T], 0, len(children))
//for _, child := range children {
// childrenSlice = append(childrenSlice, child)
//}
//HzmTree[T].AddChildren(node, childrenSlice)
for _, child := range children {
// 上面的问题可以通过可变参数传参的方式解决
HzmTree[T].AddChildren(node, child)
}
fillTree(children, parentId2NodesMap)
}
}
}
//func fillTree[T comparable](nodes []HzmTree[T], parentId2NodesMap map[T][]HzmTree[T]) {
// for _, node := range nodes {
// if children, ok := parentId2NodesMap[node.GetId()]; ok {
// node.AddChildren(children)
// fillTree(children, parentId2NodesMap)
// }
// }
//}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/hongzhaomin/hzm-common-go.git
git@gitee.com:hongzhaomin/hzm-common-go.git
hongzhaomin
hzm-common-go
hzm-common-go
475aca84af8c

搜索帮助

344bd9b3 5694891 D2dac590 5694891