diff --git a/pkg/tree/tree.go b/pkg/tree/tree.go index 100e46d..9f11281 100644 --- a/pkg/tree/tree.go +++ b/pkg/tree/tree.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 } diff --git a/pkg/tree/tree_test.go b/pkg/tree/tree_test.go index 2912490..44e9307 100644 --- a/pkg/tree/tree_test.go +++ b/pkg/tree/tree_test.go @@ -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) + } + }) + } +}