From 9263c035250f071b92407257ad62e72efd200b8f Mon Sep 17 00:00:00 2001 From: eson <474420502@qq.com> Date: Sun, 21 Jul 2019 04:10:08 +0800 Subject: [PATCH] =?UTF-8?q?TODO:=20=E4=BF=AE=E6=94=B9Iterator=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E4=B8=80=E4=B8=AA=E6=BB=91=E5=8A=A8=E5=88=B0=E8=BE=B9?= =?UTF-8?q?=E7=95=8C=E7=9A=84=E6=96=B9=E6=B3=95.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- set/treeset/treeset.go | 12 ++- set/treeset/treeset_test.go | 156 ++++++++++++++++++++++++++++++++++++ tree/avldup/avldup.go | 8 +- 4 files changed, 170 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 7321b14..d1eefd6 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ func main() { values3 := pq.GetAround(5) // values3 = [, 5, 4] log.Println(values3) - iter := pq.Iterator() // Next 小到大 + iter := pq.Iterator() // Next 小到大 从root节点起始 // log.Println(iter.Value()) 直接使用会报错, iter.Next() // Next 从小到大 log.Println(iter.Value()) // 起始最大值. true 5 diff --git a/set/treeset/treeset.go b/set/treeset/treeset.go index af76bf3..b489ac8 100644 --- a/set/treeset/treeset.go +++ b/set/treeset/treeset.go @@ -4,8 +4,8 @@ import ( "fmt" "strings" - "github.com/474420502/focus/tree/avldup" "github.com/474420502/focus/compare" + "github.com/474420502/focus/tree/avldup" ) // TreeSet @@ -70,9 +70,15 @@ func (set *TreeSet) Size() int { return set.tree.Size() } +// Iterator avl Iterator +func (set *TreeSet) Iterator() *avldup.Iterator { + return set.tree.Iterator() +} + // String func (set *TreeSet) String() string { - content := "HashSet\n" + // content := "HashSet\n" + var content = "" items := []string{} set.tree.Traversal(func(k interface{}) bool { @@ -80,6 +86,6 @@ func (set *TreeSet) String() string { return true }) - content += strings.Join(items, ", ") + content += "(" + strings.Join(items, ", ") + ")" return content } diff --git a/set/treeset/treeset_test.go b/set/treeset/treeset_test.go index 3e1768e..6e3671b 100644 --- a/set/treeset/treeset_test.go +++ b/set/treeset/treeset_test.go @@ -1 +1,157 @@ package treeset + +import ( + "strings" + "testing" + + "github.com/davecgh/go-spew/spew" + + "github.com/474420502/focus/compare" + "github.com/474420502/focus/tree/avldup" +) + +func TestTreeSet_Add(t *testing.T) { + type fields struct { + tree *avldup.Tree + } + type args struct { + items []interface{} + } + tests := []struct { + name string + result string + fields fields + args args + }{ + {name: "add int", result: "(1, 3, 5)", args: args{items: []interface{}{1, 5, 3, 3, 5}}}, + {name: "add -int", result: "(-5, 1, 5, 3132)", args: args{items: []interface{}{-5, -5, 3132, 3132, 5, 1, 1, 1}}}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + set := New(compare.Int) + set.Add(tt.args.items...) + if set.String() != tt.result { + t.Error(set.String(), " != ", tt.result) + } + }) + } + + tests2 := []struct { + name string + result string + fields fields + args args + }{ + {name: "add String 1", result: "(1, 3, 5)", args: args{items: []interface{}{"1", "5", "3", "3", "5"}}}, + {name: "add String 2", result: "(-5, 1, 3132, 5)", args: args{items: []interface{}{"-5", "-5", "3132", "3132", "5", "1", "1", "1"}}}, + {name: "add String 3", result: "(a, aa, b, bc)", args: args{items: []interface{}{"a", "b", "aa", "aa", "bc"}}}, + {name: "add String 4", result: "(他, 你, 我, 我我)", args: args{items: []interface{}{"我", "你", "他", "我", "我我"}}}, + } + for _, tt := range tests2 { + t.Run(tt.name, func(t *testing.T) { + set := New(compare.String) + set.Add(tt.args.items...) + if set.String() != tt.result { + t.Error(set.String(), " != ", tt.result) + } + + vstr := spew.Sprint(set.Values()) + + if vstr[1:len(vstr)-1] != strings.ReplaceAll(tt.result[1:len(tt.result)-1], ",", "") { + t.Error(vstr[1:len(vstr)-1], tt.result[1:len(tt.result)-1]) + } + }) + } +} + +func TestTreeSet_Remove(t *testing.T) { + type fields struct { + tree *avldup.Tree + } + type args struct { + addItems []interface{} + removeItems []interface{} + } + tests := []struct { + name string + result string + fields fields + args args + }{ + // TODO: Add test cases. + {name: "remove 1", result: "()", + args: args{ + addItems: []interface{}{5, 7, 5, 3, 2}, + removeItems: []interface{}{5, 7, 3, 2}}, + }, + + {name: "remove 2", result: "(5)", + args: args{ + addItems: []interface{}{5, 7, 5, 3, 2}, + removeItems: []interface{}{7, 3, 2}}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + set := New(compare.Int) + set.Add(tt.args.addItems...) + set.Remove(tt.args.removeItems...) + + if set.String() != tt.result { + t.Error(set.String(), " != ", tt.result) + } + }) + } +} + +func TestTreeSet_Base(t *testing.T) { + set := New(compare.Int) + set.Add(5, 4, 3, 5) + + if !set.Contains(5) { + t.Error("Contains 5 is true") + } + + set.Clear() + + if set.Contains(5) { + t.Error("Contains 5 is false") + } + + if !set.Empty() { + t.Error("should be Empty") + } + + set.Add(1, 1, 1, 2, 2, 3, 7, 9, 10) + + var results []interface{} + results = set.GetRange(4, 10) + if spew.Sprint(results) != "[7 9 10]" { + t.Error(results) + } + + results = set.GetRange(1, 10) + if spew.Sprint(results) != "[1 2 3 7 9 10]" { + t.Error(results) + } + + results3 := set.GetAround(3) + if spew.Sprint(results3) != "[2 3 7]" { + t.Error(results3) + } + + results3 = set.GetAround(1) + if spew.Sprint(results3) != "[ 1 2]" { + t.Error(results3) + } +} + +func TestTreeSet_Iterator(t *testing.T) { + set := New(compare.Int) + set.Add(5, 4, 3, 5) + + iter := set.Iterator() + for iter.Prev() { + t.Error(iter.Value()) + } +} diff --git a/tree/avldup/avldup.go b/tree/avldup/avldup.go index 8347241..5c5203a 100644 --- a/tree/avldup/avldup.go +++ b/tree/avldup/avldup.go @@ -46,14 +46,14 @@ func (tree *Tree) String() string { return str } -func (tree *Tree) Iterator() *Iterator { - return initIterator(tree) -} - func (tree *Tree) Size() int { return tree.size } +func (tree *Tree) Iterator() *Iterator { + return initIterator(tree) +} + func (tree *Tree) Remove(key interface{}) (interface{}, bool) { if n, ok := tree.GetNode(key); ok {