zoukankan      html  css  js  c++  java
  • 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
    }

    谢谢大家,谢谢!

  • 相关阅读:
    小酌一下:pipenv 基本用法
    sql2008使用您对无法重新创建的表进行了更改或者启用了“阻止保存重新创建表的更改”
    Join操作基本:外连接、自然连接、内连接
    用dataReader获取datetime类型完整精度的时间字串
    c# MesageBox
    判断当前时间是否在一个时间段内
    c# 根据当前时间获取,本周,本月,本季度,月初,月末,各个时间段
    sql Convert函数
    c# MD5方法总结
    wml跳转
  • 原文地址:https://www.cnblogs.com/tsxylhs/p/11267326.html
Copyright © 2011-2022 走看看