package main
import "fmt"
type MYMAP[K comparable, V any] map[K]V
func main() {
int1 := []int{1, 2, 3}
int2 := []int{3, 4, 5}
fmt.Println("diff:", DiffArray(int1, int2))
fmt.Println("intersect:", IntersectArray(int1, int2))
str1 := []string{"a", "b", "c"}
str2 := []string{"c", "d", "e"}
fmt.Println("diff:", DiffArray(str1, str2))
fmt.Println("intersect:", IntersectArray(str1, str2))
//过滤重复元素
intSlice := []int{1, 2, 3, 1, 2, 3}
strSlice := []string{"a", "b", "c", "d", "a", "b"}
fmt.Println("intSlice remove rep:", RemoveRepByMap(intSlice))
fmt.Println("strSlice remove rep:", RemoveRepByMap(strSlice))
}
// DiffArray 求两个切片的差集
func DiffArray[T comparable](a []T, b []T) []T {
var diffArray []T
var temp MYMAP[T, struct{}] = map[T]struct{}{}
for _, val := range b {
if _, ok := temp[val]; !ok {
temp[val] = struct{}{}
}
}
for _, val := range a {
if _, ok := temp[val]; !ok {
diffArray = append(diffArray, val)
}
}
return diffArray
}
// IntersectArray 求两个切片的交集
func IntersectArray[T comparable](a []T, b []T) []T {
var inter []T
var mp MYMAP[T, bool] = map[T]bool{}
for _, s := range a {
if _, ok := mp[s]; !ok {
mp[s] = true
}
}
for _, s := range b {
if _, ok := mp[s]; ok {
inter = append(inter, s)
}
}
return inter
}
// RemoveRepByMap 通过map主键唯一的特性过滤重复元素
func RemoveRepByMap[T comparable](slc []T) []T {
var result []T
var tempMap MYMAP[T, bool] = map[T]bool{}
for _, e := range slc {
if _, ok := tempMap[e]; !ok {
result = append(result, e)
tempMap[e] = true
}
}
return result
}
go语言交集,差集,去重(泛型版)
于 2022-11-14 20:15:09 首次发布