master
nikkiing 1 year ago
parent d0b7a52caa
commit 51ba9d1623
  1. 23
      pkg/tree/tree.go
  2. 62
      pkg/tree/tree_test.go

@ -1,10 +1,20 @@
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 一个节点长度
@ -27,15 +37,18 @@ func Tree[T any](data []T, parent string, length int, pathFunc func(d T) string)
}
// 拆分层级结构 A00001B00001C00001 拆分为 ["A00001","A00001B00001","A00001B00001C00001"]
// length A00001 一个节点长度
func Split(code string, length int) (res []string) {
if len(code) < length {
func Split(code string) (res []string) {
if code == "" {
return []string{}
}
l := Length(code)
if len(code) < l {
return
}
times := len(code) / length
times := len(code) / l
for i := 0; i < times; i++ {
res = append(res, code[:len(code)-length*i])
res = append(res, code[:len(code)-l*i])
}
return
}

@ -7,8 +7,7 @@ import (
func TestSplit(t *testing.T) {
type args struct {
code string
length int
code string
}
tests := []struct {
name string
@ -18,15 +17,28 @@ func TestSplit(t *testing.T) {
{
name: "test1",
args: args{
code: "A00001B00001C00001",
length: 6,
code: "A00001B00001C00001",
},
wantRes: []string{"A00001B00001C00001", "A00001B00001", "A00001"},
},
{
name: "test2",
args: args{
code: "A001",
},
wantRes: []string{"A001"},
},
{
name: "test3",
args: args{
code: "",
},
wantRes: []string{},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if gotRes := Split(tt.args.code, tt.args.length); !reflect.DeepEqual(gotRes, tt.wantRes) {
if gotRes := Split(tt.args.code); !reflect.DeepEqual(gotRes, tt.wantRes) {
t.Errorf("Split() = %v, want %v", gotRes, tt.wantRes)
}
})
@ -110,3 +122,43 @@ func TestTree(t *testing.T) {
})
}
}
func TestLength(t *testing.T) {
type args struct {
code string
}
tests := []struct {
name string
args args
want int
}{
{
name: "test1",
args: args{
code: "A00001B00001C00001",
},
want: 6,
},
{
name: "test2",
args: args{
code: "C0001D0001E00001",
},
want: 5,
},
{
name: "test3",
args: args{
code: "A0001",
},
want: 5,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := Length(tt.args.code); got != tt.want {
t.Errorf("length() = %v, want %v", got, tt.want)
}
})
}
}

Loading…
Cancel
Save