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
}

谢谢大家,谢谢!

原文地址:https://www.cnblogs.com/tsxylhs/p/11267326.html

时间: 2024-10-09 20:18:30

golang 数组之间的交集,差集,并集,补集的相关文章

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

http://www.jb51.net/article/40385.htm 代码如下: /** * each是一个集合迭代函数,它接受一个函数作为参数和一组可选的参数 * 这个迭代函数依次将集合的每一个元素和可选参数用函数进行计算,并将计算得的结果集返回 {%example <script> var a = [1,2,3,4].each(function(x){return x > 2 ? x : null}); var b = [1,2,3,4].each(function(x){re

用Java求字符串数组的的交集和并集

package com.array; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Map.Entry; public class StringArray { pu

两个文件diff:交集差集并集

comm comm -12 <(sort 123|uniq) <(sort 234 | uniq) | wc -l [comm -12 表示取消第一列和第二列的输出,即只输出第三列] comm命令可以求两个文件的比较结果.默认输出三列,分别表示A-B,B-A 和 A交B. comm命令要求输入文件的内容必须是排序且唯一的 https://www.xuebuyuan.com/1273561.html grep 交集:grep -F -f file1 file2 B-A:grep -F -v -f

sqlite支持各种交集差集 并集操作了

两个DataTable之间的差集、交集、并集集合(Except、Intersect、Union)

//获取第一个数据源DataTable DataTable dt1 = DBHelper.GetDataTable("select top 10  ksdid,user_id,user_pwd from ksd_user_info"); IEnumerable<DataRow> query1 = dt1.AsEnumerable().Where(t => t.Field<string>("user_id").StartsWith(&qu

python两个 list 获取交集,并集,差集的方法

有时候,为了需求,需要统计两个 list 之间的交集,并集,差集.查询了一些资料,现在总结在下面:1. 获取两个list 的交集 #方法一: a=[2,3,4,5] b=[2,5,8] tmp = [val for val in a if val in b] print tmp #[2, 5] #方法二 print list(set(a).intersection(set(b))) 2. 获取两个list 的并集 print list(set(a).union(set(b))) 3. 获取两个

python list 交集 差集

有时候,为了需求,需要统计两个 list 之间的交集,并集,差集.查询了一些资料,现在总结在下面:1. 获取两个list 的交集 #方法一: a=[2,3,4,5] b=[2,5,8] tmp = [val for val in a if val in b] print tmp #[2, 5] #方法二 print list(set(a).intersection(set(b))) 2. 获取两个list 的并集 print list(set(a).union(set(b))) 3. 获取两个

java中求两个数组(集合)的交集,并集,差集

对于两个数组 arr1=[1,3,4,5,8,9] arr2=[2,3,7,8,9] 求出交集与并集 test.java 1 import java.util.ArrayList; 2 import java.util.Collections; 3 4 5 public class test1 { 6 public static void main(String[] args) { 7 ArrayList<Integer> tmplist=new ArrayList<Integer>

python中列表之间求差集、交集、并集

求两个列表的交集.并集.差集 def diff(listA, listB): # 求交集的两种方式 retA = [i for i in listA if i in listB] retB = list(set(listA).intersection(set(listB))) print("retA is :", retA) print("retB is :", retB) # 求并集 retC = list(set(listA).union(set(listB))