TODO: 修改Iterator 添加一个滑动到边界的方法.
This commit is contained in:
parent
dbc337f8e6
commit
9263c03525
|
@ -39,7 +39,7 @@ func main() {
|
|||
values3 := pq.GetAround(5) // values3 = [<nil>, 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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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) != "[<nil> 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())
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue
Block a user