分离迭代器示例集合与有序集合

This commit is contained in:
fantasticbin 2024-11-13 14:26:19 +08:00
parent 2c5eff87f7
commit 5febea0733
2 changed files with 50 additions and 10 deletions

View File

@ -4,23 +4,41 @@ import (
"iter" "iter"
) )
// Set 集合
type Set[T comparable] struct { type Set[T comparable] struct {
m map[T]struct{}
}
// OrderedSet 有序集合
type OrderedSet[T comparable] struct {
ordered []T // 用于保持顺序 ordered []T // 用于保持顺序
m map[T]struct{} Set[T]
} }
func NewSet[T comparable]() *Set[T] { func NewSet[T comparable]() Set[T] {
return &Set[T]{make([]T, 0), make(map[T]struct{})} return Set[T]{make(map[T]struct{})}
} }
func (s *Set[T]) Add(e T) { func NewOrderedSet[T comparable]() *OrderedSet[T] {
return &OrderedSet[T]{make([]T, 0), NewSet[T]()}
}
func (s Set[T]) Add(e T) {
s.m[e] = struct{}{}
}
func (s *OrderedSet[T]) Add(e T) {
if !s.Contains(e) { if !s.Contains(e) {
s.ordered = append(s.ordered, e) s.ordered = append(s.ordered, e)
} }
s.m[e] = struct{}{} s.m[e] = struct{}{}
} }
func (s *Set[T]) Remove(e T) { func (s Set[T]) Remove(e T) {
delete(s.m, e)
}
func (s *OrderedSet[T]) Remove(e T) {
for k, v := range s.ordered { for k, v := range s.ordered {
if v == e { if v == e {
s.ordered = append(s.ordered[:k], s.ordered[k+1:]...) s.ordered = append(s.ordered[:k], s.ordered[k+1:]...)
@ -31,23 +49,45 @@ func (s *Set[T]) Remove(e T) {
delete(s.m, e) delete(s.m, e)
} }
func (s *Set[T]) Contains(e T) bool { func (s Set[T]) Contains(e T) bool {
_, ok := s.m[e] _, ok := s.m[e]
return ok return ok
} }
func (s *Set[T]) Len() int { func (s Set[T]) Len() int {
return len(s.m) return len(s.m)
} }
func (s *Set[T]) All() iter.Seq[T] { func (s Set[T]) All() iter.Seq[T] {
return s.FilterMap(func(T) bool {
return true
})
}
// All 有序集合的推迭代器该方法不能省略否则会走到子集合的FilterMap方法中去
func (s *OrderedSet[T]) All() iter.Seq[T] {
return s.FilterMap(func(T) bool { return s.FilterMap(func(T) bool {
return true return true
}) })
} }
// FilterMap 筛选迭代 // FilterMap 筛选迭代
func (s *Set[T]) FilterMap(fn func(T) bool) iter.Seq[T] { func (s Set[T]) FilterMap(fn func(T) bool) iter.Seq[T] {
return func(yield func(T) bool) {
for v := range s.m {
if !fn(v) {
continue
}
if !yield(v) {
return
}
}
}
}
// FilterMap 筛选迭代
func (s *OrderedSet[T]) FilterMap(fn func(T) bool) iter.Seq[T] {
return func(yield func(T) bool) { return func(yield func(T) bool) {
// 迭代有序切片 // 迭代有序切片
for _, v := range s.ordered { for _, v := range s.ordered {

View File

@ -8,7 +8,7 @@ import (
) )
func TestSet(t *testing.T) { func TestSet(t *testing.T) {
s := NewSet[string]() s := NewOrderedSet[string]()
list := []string{ list := []string{
"fantasticbin", "fantasticbin",
"phper", "phper",