You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
package tree
|
|
|
|
|
|
|
|
import (
|
|
|
|
"regexp"
|
|
|
|
)
|
|
|
|
|
|
|
|
type Node[T any] struct {
|
|
|
|
Data T `json:"data"`
|
|
|
|
Children []Node[T] `json:"children"`
|
|
|
|
}
|
|
|
|
|
|
|
|
func Length(code string) int {
|
|
|
|
re := regexp.MustCompile(`[A-Z]\d+`)
|
|
|
|
match := re.FindString(code)
|
|
|
|
return len(match)
|
|
|
|
}
|
|
|
|
|
|
|
|
// 适用 A00001B00001 层级结构
|
|
|
|
// parent 父级字符串
|
|
|
|
// length A00001 一个节点长度
|
|
|
|
// pathFunc 返回T的code A00001
|
|
|
|
func Tree[T any](data []T, parent string, length int, pathFunc func(d T) string) (res []Node[T]) {
|
|
|
|
for _, v := range data {
|
|
|
|
path := pathFunc(v)
|
|
|
|
if len(path) < length {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
p := path[:len(path)-length]
|
|
|
|
if p == parent {
|
|
|
|
res = append(res, Node[T]{
|
|
|
|
Data: v,
|
|
|
|
Children: Tree[T](data, path, length, pathFunc),
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// 拆分层级结构 A00001B00001C00001 拆分为 ["A00001","A00001B00001","A00001B00001C00001"]
|
|
|
|
func Split(code string) (res []string) {
|
|
|
|
if code == "" {
|
|
|
|
return []string{}
|
|
|
|
}
|
|
|
|
l := Length(code)
|
|
|
|
if len(code) < l {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
times := len(code) / l
|
|
|
|
for i := 0; i < times; i++ {
|
|
|
|
res = append(res, code[:len(code)-l*i])
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|