写在前面
写算法题的时候需要用到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
}