set.go 863 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. package types
  2. type Set[T comparable] struct {
  3. items map[T]struct{}
  4. }
  5. // NewSet 创建并返回一个新的 Set
  6. func NewSet[T comparable]() *Set[T] {
  7. return &Set[T]{
  8. items: make(map[T]struct{}),
  9. }
  10. }
  11. func (s *Set[T]) Add(item T) {
  12. s.items[item] = struct{}{}
  13. }
  14. // Remove 从 Set 中移除一个元素
  15. func (s *Set[T]) Remove(item T) {
  16. delete(s.items, item)
  17. }
  18. // Contains 检查 Set 是否包含某个元素
  19. func (s *Set[T]) Contains(item T) bool {
  20. _, exists := s.items[item]
  21. return exists
  22. }
  23. // Len 返回 Set 中元素的数量
  24. func (s *Set[T]) Len() int {
  25. return len(s.items)
  26. }
  27. // Items 返回 Set 中所有元素组成的切片
  28. // 注意:由于 map 的无序性,返回的切片元素顺序是随机的
  29. func (s *Set[T]) Items() []T {
  30. items := make([]T, 0, s.Len())
  31. for item := range s.items {
  32. items = append(items, item)
  33. }
  34. return items
  35. }