go 泛型set实现

24 阅读1分钟

写在前面

写算法题的时候需要用到set,当时用map实现了一个int set。本文基于int set扩展和完善了一下,支持泛型,方法也多了一些,仅供学习。

代码

// Set支持的数据类型
type SetType interface {
    int | int8 | int16 | int32 | string
}

type Set[T SetType] interface {
    Add(T)
    Remove(T) bool
    Count() int
    Data() []T
}

var empty = struct{}{}

type set[T SetType] map[T]struct{}

func New[T SetType]() Set[T] {
    s := make(set[T])
    return s
}

func (s set[T]) Add(x T) {
    s[x] = empty
}

func (s set[T]) Remove(x T) bool {
    if _, ok := s[x]; ok {
       delete(s, x)
       return true
    }
    return false
}

func (s set[T]) Count() int {
    return len(s)
}

func (s set[T]) Data() []T {
    result := make([]T, 0, len(s))
    for i := range s {
       result = append(result, i)
    }
    return result
}