今天公司需求两个数组之间的差集,类库下不下来,就独立出来了一份,希望读者有用

package model

import (
"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) ==
} // 无序列表
func (s *Set) List() []int {
s.RLock()
defer s.RUnlock()
list := make([]int, , 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, , 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
}

谢谢大家,谢谢!

最新文章

  1. php引用
  2. 用java 代码下载Samba服务器上的文件到本地目录以及上传本地文件到Samba服务器
  3. C++线程中packaged_tack
  4. CAP理论
  5. hdu 5791 (DP) Two
  6. Java排序算法(1)
  7. TopFreeTheme精选免费模板【20130619】
  8. jquery 插件的编写
  9. C#线程池ThreadPool.QueueUserWorkItem接收线程执行的方法返回值
  10. MySQL基础操/下
  11. springMVC 使用ajax 出现No serializer found for class异常
  12. ionic 3 icon和splash screen生成和设置
  13. 工控随笔_04_西门子_解决Step 7软件因授权问题不能打开的方式和方法
  14. Python中的可变、不可变对象和赋值技巧序列解包
  15. Spring的bean管理(注解方式)
  16. 20本最好的Linux免费书籍
  17. 解析Google集群资源管理系统Omega
  18. PHP中文件操作(2)-- 写文件
  19. Monte Carlo methods
  20. Mysql优化分页

热门文章

  1. DHCP服务+PXE自动安装系统
  2. 关于socket buffer size的调优
  3. C++学习笔记-异常处理
  4. windows ping命令
  5. SQLite基础-7.子句(一)
  6. 洛谷P1603 斯诺登的密码(水题
  7. PAT B1002 写出这个数(20)
  8. python新手必躺的5大坑
  9. X86逆向12:内存补丁的制作
  10. signalfx的中间件监控指标so cool