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

     还是需要吐槽下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实现。比如下面的例子就可以实现去重。

	m := map[string]int{
		"baidu.com":  0,
		"apple.com":  0,
		"google.com": 0,
		"google.com": 0,
	}

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

  # command-line-arguments
  ./s.go:13: duplicate key "google.com" in map literal
  
  exit status 2

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

#http://xiaorui.cc
go get https://github.com/deckarep/golang-set.git
package https:/github.com/deckarep/golang-set.git: "https://" not allowed in import path go get github.com/deckarep/golang-set.git
package github.com/deckarep/golang-set.git: invalid version control suffix in github.com/ path

# ruifengyun at xiaorui in ~ [22:12:56]
$ go get github.com/deckarep/golang-set

下面是go set的使用实例.

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代码运行的结果:

[ `go run s.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集合本来就没啥说的….


大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc

发表评论

邮箱地址不会被公开。 必填项已用*标注