• 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
    }

    谢谢大家,谢谢!

  • 相关阅读:
    Ural 1201 Which Day Is It? 题解
    Ural 1250 Sea Burial 题解
    2019 Multi-University Training Contest 2: 1010 Just Skip The Problem 自闭记
    Codeforces 718A Efim and Strange Grade 程序分析
    CentOS7 修改MySql默认端口
    Ubuntu 18.04 版本中安装mysql 8的方法
    NET_NET深入体验与实战 第一章 .NET你知道 1.1什么是 .NET
    第五课
    c# 第一节课 一些简单的应用
    MDI窗体和窗体之间的操作总结
  • 原文地址:https://www.cnblogs.com/tsxylhs/p/11267326.html
Copyright © 2020-2023  润新知