43 lines
863 B
Go
43 lines
863 B
Go
package types
|
|
|
|
type Set[T comparable] struct {
|
|
items map[T]struct{}
|
|
}
|
|
|
|
// NewSet 创建并返回一个新的 Set
|
|
func NewSet[T comparable]() *Set[T] {
|
|
return &Set[T]{
|
|
items: make(map[T]struct{}),
|
|
}
|
|
}
|
|
|
|
func (s *Set[T]) Add(item T) {
|
|
s.items[item] = struct{}{}
|
|
}
|
|
|
|
// Remove 从 Set 中移除一个元素
|
|
func (s *Set[T]) Remove(item T) {
|
|
delete(s.items, item)
|
|
}
|
|
|
|
// Contains 检查 Set 是否包含某个元素
|
|
func (s *Set[T]) Contains(item T) bool {
|
|
_, exists := s.items[item]
|
|
return exists
|
|
}
|
|
|
|
// Len 返回 Set 中元素的数量
|
|
func (s *Set[T]) Len() int {
|
|
return len(s.items)
|
|
}
|
|
|
|
// Items 返回 Set 中所有元素组成的切片
|
|
// 注意:由于 map 的无序性,返回的切片元素顺序是随机的
|
|
func (s *Set[T]) Items() []T {
|
|
items := make([]T, 0, s.Len())
|
|
for item := range s.items {
|
|
items = append(items, item)
|
|
}
|
|
return items
|
|
}
|