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 Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

Golang 日志处理和正则处理的操作方法

《Golang日志处理和正则处理的操作方法》:本文主要介绍Golang日志处理和正则处理的操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录1、logx日志处理1.1、logx简介1.2、日志初始化与配置1.3、常用方法1.4、配合defer

golang float和科学计数法转字符串的实现方式

《golangfloat和科学计数法转字符串的实现方式》:本文主要介绍golangfloat和科学计数法转字符串的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望... 目录golang float和科学计数法转字符串需要对float转字符串做处理总结golang float

golang实现延迟队列(delay queue)的两种实现

《golang实现延迟队列(delayqueue)的两种实现》本文主要介绍了golang实现延迟队列(delayqueue)的两种实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录1 延迟队列:邮件提醒、订单自动取消2 实现2.1 simplChina编程e简单版:go自带的time

Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)

《Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)》本文主要介绍了Golang分布式锁实现,采用Redis+Lua脚本确保原子性,持可重入和自动续期,用于防止超卖及重复下单,具有一定... 目录1 概念应用场景分布式锁必备特性2 思路分析宕机与过期防止误删keyLua保证原子性可重入锁自动

golang 对象池sync.Pool的实现

《golang对象池sync.Pool的实现》:本文主要介绍golang对象池sync.Pool的实现,用于缓存和复用临时对象,以减少内存分配和垃圾回收的压力,下面就来介绍一下,感兴趣的可以了解... 目录sync.Pool的用法原理sync.Pool 的使用示例sync.Pool 的使用场景注意sync.

golang中slice扩容的具体实现

《golang中slice扩容的具体实现》Go语言中的切片扩容机制是Go运行时的一个关键部分,它确保切片在动态增加元素时能够高效地管理内存,本文主要介绍了golang中slice扩容的具体实现,感兴趣... 目录1. 切片扩容的触发append 函数的实现2. runtime.growslice 函数gro

golang实现动态路由的项目实践

《golang实现动态路由的项目实践》本文主要介绍了golang实现动态路由项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习... 目录一、动态路由1.结构体(数据库的定义)2.预加载preload3.添加关联的方法一、动态路由1

Golang interface{}的具体使用

《Golanginterface{}的具体使用》interface{}是Go中可以表示任意类型的空接口,本文主要介绍了Golanginterface{}的具体使用,具有一定的参考价值,感兴趣的可以了... 目录一、什么是 interface{}?定义形China编程式:二、interface{} 有什么特别的?✅