分享
  1. 首页
  2. 文章

golang set集合实现去重及交叉并集计算

rfyiamcool · · 6982 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

还是需要吐槽下golang默认的标准库不是很全面,虽然可以通过map来实现简易的set集合,但这毕竟费工夫呀。不知道golang啥时候才能有个较完美的库包服务,类似python的pypi,node.js的npm...


该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新。

http://xiaorui.cc/?p=2944


我这边有个场景是针对数据去重,但又不是简单的去重,是有时间区间范围内的交集、并集计算。

废话不多说,我估计有不少人记不清集合的并集、差集、交集的概念了。


集合的分类:

并集:以属于A或属于B的元素为元素的集合成为A与B的并(集)
交集: 以属于A且属于B的元素为元素的集合成为A与B的交(集)

差集:以属于A而不属于B的元素为元素的集合成为A与B的差 (集)


如果只是去重的化,完全可以使用golang map实现。比如下面的例子就可以实现去重。

Python
1
2
3
4
5
6
7
m:=map[string]int{
"baidu.com":0,
"apple.com":0,
"google.com":0,
"google.com":0,
}

和我们预料的一样,必须出错 !

Python
1
2
3
4
5
# command-line-arguments
./s.go:13:duplicate key"google.com"inmapliteral
exit status2

golang-set是我在github找到的一个库,其实也没得选.... go get 安装go库包时候因为参数不对,总是失败....

Python
1
2
3
4
5
6
7
8
9
10
#http://xiaorui.cc
$go get https://github.com/deckarep/golang-set.git
package https:/github.com/deckarep/golang-set.git:"https://"notallowed inimportpath
$go get github.com/deckarep/golang-set.git
package github.com/deckarep/golang-set.git:invalid version control suffix ingithub.com/path
# ruifengyun at xiaorui in ~ [22:12:56]
$go get github.com/deckarep/golang-set

下面是go set的使用实例.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package main
import(
"fmt"
"github.com/deckarep/golang-set"
)
func main(){
kide:=mapset.NewSet()
kide.Add("xiaorui.cc")
kide.Add("blog.xiaorui.cc")
kide.Add("vps.xiaorui.cc")
kide.Add("linode.xiaorui.cc")
special:=[]interface{}{"Biology","Chemistry"}
scienceClasses:=mapset.NewSetFromSlice(special)
address:=mapset.NewSet()
address.Add("beijing")
address.Add("nanjing")
address.Add("shanghai")
bonusClasses:=mapset.NewSet()
bonusClasses.Add("Go Programming")
bonusClasses.Add("Python Programming")
//一个并集的运算
allClasses:=kide.Union(scienceClasses).Union(address).Union(bonusClasses)
fmt.Println(allClasses)
//是否包含"Cookiing"
fmt.Println(scienceClasses.Contains("Cooking"))//false
//两个集合的差集
fmt.Println(allClasses.Difference(scienceClasses))//Set{Music,Automotive,Go Programming,Python Programming,Cooking,English,Math,Welding}
//两个集合的交集
fmt.Println(scienceClasses.Intersect(kide))//Set{Biology}
//有多少基数
fmt.Println(bonusClasses.Cardinality())//2
}

上面那段go代码运行的结果:

Python
1
2
3
4
5
6
7
[`go runs.go`|done:432.97906ms]
Set{vps.xiaorui.cc,Biology,blog.xiaorui.cc,Go Programming,Python Programming,linode.xiaorui.cc,Chemistry,xiaorui.cc,beijing,nanjing,shanghai}
false
Set{linode.xiaorui.cc,xiaorui.cc,nanjing,vps.xiaorui.cc,blog.xiaorui.cc,Go Programming,shanghai,Python Programming,beijing}
Set{}
2

set集合本来就没啥说的....


有疑问加站长微信联系(非本文作者)

本文来自:峰云就她了

感谢作者:rfyiamcool

查看原文:golang set集合实现去重及交叉并集计算

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
6982 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏