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

相关文章

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

java父子线程之间实现共享传递数据

《java父子线程之间实现共享传递数据》本文介绍了Java中父子线程间共享传递数据的几种方法,包括ThreadLocal变量、并发集合和内存队列或消息队列,并提醒注意并发安全问题... 目录通过 ThreadLocal 变量共享数据通过并发集合共享数据通过内存队列或消息队列共享数据注意并发安全问题总结在 J

Java文件与Base64之间的转化方式

《Java文件与Base64之间的转化方式》这篇文章介绍了如何使用Java将文件(如图片、视频)转换为Base64编码,以及如何将Base64编码转换回文件,通过提供具体的工具类实现,作者希望帮助读者... 目录Java文件与Base64之间的转化1、文件转Base64工具类2、Base64转文件工具类3、

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min