首页 > 代码库 > 代码片段 - Golang 实现集合操作

代码片段 - Golang 实现集合操作

package mainimport (	"fmt"	"sort"	"sync")type Set struct {	sync.RWMutex	m map[int]bool}// 新建集合对象func New(items ...int) *Set {	s := &Set{		m: make(map[int]bool, len(items)),	}	s.Add(items...)	return s}// 添加元素func (s *Set) Add(items ...int) {	s.Lock()	defer s.Unlock()	for _, v := range items {		s.m[v] = true	}}// 删除元素func (s *Set) Remove(items ...int) {	s.Lock()	defer s.Unlock()	for _, v := range items {		delete(s.m, v)	}}// 判断元素是否存在func (s *Set) Has(items ...int) bool {	s.RLock()	defer s.RUnlock()	for _, v := range items {		if _, ok := s.m[v]; !ok {			return false		}	}	return true}// 元素个数func (s *Set) Count() int {	return len(s.m)}// 清空集合func (s *Set) Clear() {	s.Lock()	defer s.Unlock()	s.m = map[int]bool{}}// 空集合判断func (s *Set) Empty() bool {	return len(s.m) == 0}// 无序列表func (s *Set) List() []int {	s.RLock()	defer s.RUnlock()	list := make([]int, 0, len(s.m))	for item := range s.m {		list = append(list, item)	}	return list}// 排序列表func (s *Set) SortList() []int {	s.RLock()	defer s.RUnlock()	list := make([]int, 0, len(s.m))	for item := range s.m {		list = append(list, item)	}	sort.Ints(list)	return list}// 并集func (s *Set) Union(sets ...*Set) *Set {	r := New(s.List()...)	for _, set := range sets {		for e := range set.m {			r.m[e] = true		}	}	return r}// 差集func (s *Set) Minus(sets ...*Set) *Set {	r := New(s.List()...)	for _, set := range sets {		for e := range set.m {			if _, ok := s.m[e]; ok {				delete(r.m, e)			}		}	}	return r}// 交集func (s *Set) Intersect(sets ...*Set) *Set {	r := New(s.List()...)	for _, set := range sets {		for e := range s.m {			if _, ok := set.m[e]; !ok {				delete(r.m, e)			}		}	}	return r}// 补集func (s *Set) Complement(full *Set) *Set {	r := New()	for e := range full.m {		if _, ok := s.m[e]; !ok {			r.Add(e)		}	}	return r}func main() {	s1 := New(1, 2, 3, 4, 5, 6, 7, 8)	s2 := New(3, 4, 5, 6)	s3 := New(5, 6, 9, 10)	r1 := s1.Union(s2, s3)     // 获取并集	r2 := s1.Minus(s2, s3)     // 获取差集	r3 := s1.Intersect(s2, s3) // 获取交集	r4 := s3.Complement(s1)    // 获取 s3 相对于 s1 的补集	fmt.Println(r1.SortList())	fmt.Println(r2.SortList())	fmt.Println(r3.SortList())	fmt.Println(r4.SortList())}

代码片段 - Golang 实现集合操作