# Golangで集合の演算
何も使わずに実装する
和集合
package main
import "fmt"
func main() {
a := []int{1, 2, 3}
b := []int{2, 3, 4}
c := []int{3}
result := func(array ...[]int) []int {
m := make(map[int]struct{})
for _, arr := range array {
for _, v := range arr {
m[v] = struct{}{}
}
}
tmp := []int{}
for k := range m {
tmp = append(tmp, k)
}
return tmp
}(a, b, c)
fmt.Println(result)
}
// [3 4 1 2]
積集合
package main
import "fmt"
func main() {
a := []int{1, 2, 3}
b := []int{2, 3, 4}
c := []int{3}
result := func(array ...[]int) []int {
m := make(map[int]struct{})
tmp1 := []int{}
tmp2 := []int{}
for _, v := range array[0] {
m[v] = struct{}{}
}
for _, v := range array[1] {
if _, ok := m[v]; !ok {
continue
}
tmp1 = append(tmp1, v)
}
for i := 0; i < len(array)-2; i++ {
func(arr1, arr2 []int) {
m := make(map[int]struct{})
for _, v := range arr1 {
m[v] = struct{}{}
}
for _, v := range arr2 {
if _, ok := m[v]; !ok {
continue
}
tmp2 = append(tmp2, v)
}
}(tmp1, array[i+2])
}
return tmp2
}(a, b, c)
uniqueResult := func(arr []int) []int {
m := make(map[int]struct{})
tmp := make([]int, 0)
for _, v := range arr {
if _, ok := m[v]; !ok {
m[v] = struct{}{}
tmp = append(tmp, v)
}
}
return tmp
}(result)
fmt.Println(uniqueResult)
}
// [3]
差集合を実装してみる
package main
import "fmt"
func main() {
a := []int{1, 2, 3}
b := []int{2, 3}
result := func(arr1, arr2 []int) []int {
m := make(map[int]struct{})
for _, v := range arr2 {
m[v] = struct{}{}
}
tmp := []int{}
for _, v := range arr1 {
if _, ok := m[v]; ok {
continue
}
tmp = append(tmp, v)
}
return tmp
}(a, b)
fmt.Println(result)
}
// [1]
github.com/golang-collections/collections を使って実装する
和集合
package main
import (
"fmt"
"github.com/golang-collections/collections/set"
)
func main() {
a := []int{1, 2, 3}
b := []int{2, 3, 4}
c := []int{3}
aSet := set.New()
bSet := set.New()
cSet := set.New()
for _, v := range a {
aSet.Insert(v)
}
for _, v := range b {
bSet.Insert(v)
}
for _, v := range c {
cSet.Insert(v)
}
result := aSet.Union(bSet).Union(cSet)
resultArr := []int{}
result.Do(func(i interface{}) { resultArr = append(resultArr, i.(int)) })
fmt.Println(resultArr)
}
// [1 2 3 4]
積集合
package main
import (
"fmt"
"github.com/golang-collections/collections/set"
)
func main() {
a := []int{1, 2, 3}
b := []int{2, 3, 4}
c := []int{3}
aSet := set.New()
bSet := set.New()
cSet := set.New()
for _, v := range a {
aSet.Insert(v)
}
for _, v := range b {
bSet.Insert(v)
}
for _, v := range c {
cSet.Insert(v)
}
result := aSet.Intersection(bSet).Intersection(cSet)
resultArr := []int{}
result.Do(func(i interface{}) { resultArr = append(resultArr, i.(int)) })
fmt.Println(resultArr)
}
// [3]
差集合を実装してみる
package main
import (
"fmt"
"github.com/golang-collections/collections/set"
)
func main() {
a := []int{1, 2, 3}
b := []int{2, 3}
aSet := set.New()
bSet := set.New()
for _, v := range a {
aSet.Insert(v)
}
for _, v := range b {
bSet.Insert(v)
}
result := aSet.Difference(bSet)
resultArr := []int{}
result.Do(func(i interface{}) { resultArr = append(resultArr, i.(int)) })
fmt.Println(resultArr)
}
// [1]