golang 数组之间的交集,差集,并集,补集
package model
import (
"sort"
"sync"
)
type Set struct {
m map[int]bool
}
// 新建集合对象
func New(items ...int) *Set {
s := &Set{
m: make(map[int]bool, len(items)),
}
(items...)
return s
}
// 添加元素
func (s *Set) Add(items ...int) {
()
defer ()
for _, v := range items {
[v] = true
}
}
// 删除元素
func (s *Set) Remove(items ...int) {
()
defer ()
for _, v := range items {
delete(, v)
}
}
// 判断元素是否存在
func (s *Set) Has(items ...int) bool {
()
defer ()
for _, v := range items {
if _, ok := [v]; !ok {
return false
}
}
return true
}
// 元素个数
func (s *Set) Count() int {
return len()
}
// 清空集合
func (s *Set) Clear() {
()
defer ()
= map[int]bool{}
}
// 空集合判断
func (s *Set) Empty() bool {
return len() == 0
}
// 无序列表
func (s *Set) List() []int {
()
defer ()
list := make([]int, 0, len())
for item := range {
list = append(list, item)
}
return list
}
// 排序列表
func (s *Set) SortList() []int {
()
defer ()
list := make([]int, 0, len())
for item := range {
list = append(list, item)
}
(list)
return list
}
// 并集
func (s *Set) Union(sets ...*Set) *Set {
r := New(()...)
for _, set := range sets {
for e := range set.m {
[e] = true
}
}
return r
}
// 差集
func (s *Set) Minus(sets ...*Set) *Set {
r := New(()...)
for _, set := range sets {
for e := range set.m {
if _, ok := [e]; ok {
delete(, e)
}
}
}
return r
}
// 交集
func (s *Set) Intersect(sets ...*Set) *Set {
r := New(()...)
for _, set := range sets {
for e := range {
if _, ok := set.m[e]; !ok {
delete(, e)
}
}
}
return r
}
// 补集
func (s *Set) Complement(full *Set) *Set {
r := New()
for e := range {
if _, ok := [e]; !ok {
(e)
}
}
return r
}