代码拉取完成,页面将自动刷新
package utils
import (
"fmt"
)
// ArrayIntersection 取数组交集
func ArrayIntersection[T interface{}](slices ...[]T) []T {
elemCount := make(map[string]int)
elements := make(map[string]T)
for _, item := range slices {
temp := make(map[string]bool)
for _, v := range item {
k := fmt.Sprintf("%+v", v)
elements[k] = v
if _, exist := temp[k]; exist {
// 避免当前切片内重复元素干扰
continue
}
temp[k] = true
if _, exists := elemCount[k]; !exists {
elemCount[k] = 0
}
//计数
elemCount[k]++
}
}
var intersection []T
for k, v := range elemCount {
//计数值=总数组数则是所有数都存在的
if v == len(slices) {
intersection = append(intersection, elements[k])
}
}
return intersection
}
// ArrayDifference 取数组差集
func ArrayDifference[T interface{}](slices ...[]T) []T {
elemCount := make(map[string]int)
elements := make(map[string]T)
for _, item := range slices {
temp := make(map[string]bool)
for _, v := range item {
k := fmt.Sprintf("%+v", v)
fmt.Printf("%s\n", k)
elements[k] = v
if _, exist := temp[k]; exist {
// 避免当前切片内重复元素干扰
continue
}
temp[k] = true
if _, exists := elemCount[k]; !exists {
elemCount[k] = 0
}
//计数
elemCount[k]++
}
}
var intersection []T
for k, v := range elemCount {
//计数值=1表示只出现过一次的,即为差值
if v == 1 {
intersection = append(intersection, elements[k])
}
}
return intersection
}
// ArrayUnion 取数组并集
func ArrayUnion[T interface{}](slices ...[]T) []T {
var union []T
m := make(map[string]bool)
for _, item := range slices {
for _, v := range item {
k := fmt.Sprintf("%+v", v)
if _, exist := m[k]; exist {
continue
}
m[k] = true
union = append(union, v)
}
}
return union
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。