focus/set/treeset/treeset.go
2019-05-08 11:04:03 +08:00

86 lines
1.5 KiB
Go

package treeset
import (
"fmt"
"strings"
"github.com/474420502/focus/avldup"
"github.com/474420502/focus/compare"
)
// TreeSet
type TreeSet struct {
tree *avldup.Tree
}
// New
func New(Compare compare.Compare) *TreeSet {
return &TreeSet{tree: avldup.New(Compare)}
}
// Add
func (set *TreeSet) Add(items ...interface{}) {
for _, item := range items {
set.tree.Put(item)
}
}
// Remove
func (set *TreeSet) Remove(items ...interface{}) {
for _, item := range items {
set.tree.Remove(item)
}
}
// Values
func (set *TreeSet) Values() []interface{} {
return set.tree.Values()
}
// Contains
func (set *TreeSet) Contains(item interface{}) bool {
if _, ok := set.tree.Get(item); ok {
return true
}
return false
}
// Contains the result is [r1,r2], not [r1, r2)
func (set *TreeSet) GetRange(r1, r2 interface{}) (result []interface{}) {
return set.tree.GetRange(r1, r2)
}
// Contains the result is [r1,item,r2] r1->item->r2 are close-knit
func (set *TreeSet) GetAround(item interface{}) (result [3]interface{}) {
return set.tree.GetAround(item)
}
// Empty
func (set *TreeSet) Empty() bool {
return set.Size() == 0
}
// Clear
func (set *TreeSet) Clear() {
set.tree.Clear()
}
// Size
func (set *TreeSet) Size() int {
return set.tree.Size()
}
// String
func (set *TreeSet) String() string {
content := "HashSet\n"
items := []string{}
set.tree.Traversal(func(k interface{}) bool {
items = append(items, fmt.Sprintf("%v", k))
return true
})
content += strings.Join(items, ", ")
return content
}