golang 数组之间的交集,差集,并集,补集

Posted tsxylhs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang 数组之间的交集,差集,并集,补集相关的知识,希望对你有一定的参考价值。

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

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) == 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

谢谢大家,谢谢!

以上是关于golang 数组之间的交集,差集,并集,补集的主要内容,如果未能解决你的问题,请参考以下文章

数组的 交集 差集 补集 并集

Java List 集合取 交集并集差集补集 Java集合取交集Java集合并集

JS - 计算两个数组的交集差集并集补集(多种实现方式)

js取两个数组的交集|差集|并集|补集|去重示例代码

PHP数组的几个操作,求并集,交集,差集,数组

List交集并集补集差集