代码片段 - Golang 实现集合操作

package main

import (
	"fmt"
	"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
}

func main() {
	s1 := New(1, 2, 3, 4, 5, 6, 7, 8)
	s2 := New(3, 4, 5, 6)
	s3 := New(5, 6, 9, 10)
	r1 := s1.Union(s2, s3)     // 获取并集
	r2 := s1.Minus(s2, s3)     // 获取差集
	r3 := s1.Intersect(s2, s3) // 获取交集
	r4 := s3.Complement(s1)    // 获取 s3 相对于 s1 的补集
	fmt.Println(r1.SortList())
	fmt.Println(r2.SortList())
	fmt.Println(r3.SortList())
	fmt.Println(r4.SortList())
}
时间: 2024-08-10 23:39:31

代码片段 - Golang 实现集合操作的相关文章

代码片段 - Golang 实现简单的 Web 服务器

------------------------------ 下面一段代码,实现了最简单的 Web 服务器: 编译环境: Linux Mint 18 Cinnamon 64-bit Golang 1.7 ------------------------------ // main.go package main import ( "fmt" "log" "net/http" ) // 处理主页请求 func index(w http.Respon

golang代码片段(摘抄)

以下是从golang并发编程实战2中摘抄过来的代码片段,主要是实现一个简单的tcp socket通讯(客户端发送一个数字,服务端计算该数字的立方根然后返回),写的不错,用到了go的并发以及看下郝林大神是如何处理socket通讯的.具体代码记录如下,多看多学习多共勉: package main import ( "net" "strings" "fmt" "time" "io" "bytes&quo

致PHP程序员:快速执行C#代码片段 快速运行C#代码 调试C# C#写人文件操作

身为PHP老鸟,临时接到救火任务,帮忙调试一串C#代码,本人Win8.1 32位,安装Microsoft Visio 2013死活安装不上去,安装win8.1自带的IIS6.0, 安装成功了,死活无法启动ASP.NET网站,根据提示服务依赖逐个启动,依旧无法启动IIS... 崩溃了..还把我本地的mongodb.apache.mysql导致无法正常启动... 怎么办?难道没有Microsoft Visio 和 IIS 就无法调试C#代码片段了么? 非也! 1.首先确定你安装了.NET框架,然后把

收集的35个 jQuery 小技巧/代码片段,可以帮你快速开发.

1. 禁止右键点击 $(document).ready(function(){     $(document).bind("contextmenu",function(e){         return false;     }); }); 2. 隐藏搜索文本框文字 Hide when clicked in the search field, the value.(example can be found below in the comment fields) $(document

一些实用的JQuery代码片段收集

本文将展示50个非常实用的JQuery代码片段,这些代码能够给你的JavaScript项目提供帮助.其中的一些代码段是从jQuery1.4.2才开始支持的做法,另一些则是真正有用的函数或方法,他们能够帮助你又快又好地把事情完成.好好仔细看一遍,你肯定会有收获.嫩江县海洋局 如何修改jQuery默认编码(例如默认UTF-8改成改GB2312): $.ajaxSetup({ ajaxSettings:{ contentType:"application/x-www-form-urlencoded;c

实用jQuery代码片段

maco精选的一些jQuery代码,也许你从中可以举一反三[代码] [JavaScript]代码001<p>002    <h3><span >★ 使用jQuery来切换样式表</h3>003    <pre class="brush:js">$("link[media='screen']").attr("href", "Alternative.css");</

有用的Python代码片段

我列出的这些有用的Python代码片段,为我节省了大量的时间,并且我希望他们也能为你节省一些时间.大多数的这些片段出自寻找解决方案,查找博客和StackOverflow解决类似问题的答案.下面所有的代码片段已经在Python 3中测试. 在Python中调用一个外部命令 有时你需要通过shell或命令提示符调用一个外部命令,这在Python中通过使用subprocess模块很容易实现. 只需要运行一条命令: import subprocess subprocess.call(['mkdir',

50个jquery代码片段(转)

本文会给你们展示50个jquery代码片段,这些代码能够给你的javascript项目提供帮助.其中的一些代码段是从jQuery1.4.2才开始支持的做法,另一些则是真正有用的函数或方法,他们能够帮助你又快又好地把事情完成.如果你发现你任何可以做得更好的地方的话,欢迎把你的版本粘贴在评论中! 1. 如何修改jQuery默认编码(例如默认UTF-8改成改GB2312): $.ajaxSetup({ ajaxSettings:{ contentType:"application/x-www-form

【干货】Xcode 6 技巧: 矢量图像,代码片段以及其他

原文:Xcode 6 Tips: Vector Images, Code Snippets and Many More,译者:yuewang 目录: 一.Creating a Sample Project 二.更换Themes 三.添加自定义字体 四.代码片段 五.自定义调色板 六.使用矢量图 七.管理你的源代码 八.总结 作为一名开发者,无论你是职业的还是为了兴趣,毫无疑问的是你肯定会花无数的时间坐在显示器前等待你的工程完毕.感觉你正在使用的编程工具得心应手非常重要,因为它们是你的虚拟工作空间