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

2024-04-24 17:32

本文主要是介绍golang 数组之间的交集,差集,并集,补集,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

package modelimport ("sort""sync"
)type Set struct {sync.RWMutexm 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 数组之间的交集,差集,并集,补集的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/932380

相关文章

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

golang 日志log与logrus示例详解

《golang日志log与logrus示例详解》log是Go语言标准库中一个简单的日志库,本文给大家介绍golang日志log与logrus示例详解,感兴趣的朋友一起看看吧... 目录一、Go 标准库 log 详解1. 功能特点2. 常用函数3. 示例代码4. 优势和局限二、第三方库 logrus 详解1.

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

Python实现PDF与多种图片格式之间互转(PNG, JPG, BMP, EMF, SVG)

《Python实现PDF与多种图片格式之间互转(PNG,JPG,BMP,EMF,SVG)》PDF和图片是我们日常生活和工作中常用的文件格式,有时候,我们可能需要将PDF和图片进行格式互转来满足... 目录一、介绍二、安装python库三、Python实现多种图片格式转PDF1、单张图片转换为PDF2、多张图

Golang中拼接字符串的6种方式性能对比

《Golang中拼接字符串的6种方式性能对比》golang的string类型是不可修改的,对于拼接字符串来说,本质上还是创建一个新的对象将数据放进去,主要有6种拼接方式,下面小编就来为大家详细讲讲吧... 目录拼接方式介绍性能对比测试代码测试结果源码分析golang的string类型是不可修改的,对于拼接字