Files
go-easy-utils/slicex/setof.go
2025-07-08 15:26:54 +08:00

71 lines
1.3 KiB
Go

package slicex
// Diff 计算差集
func Diff[T comparable](s []T, slices ...[]T) []T {
seen := make(map[T]bool)
for _, slice := range slices {
for _, elem := range slice {
seen[elem] = true
}
}
var result []T
for _, elem := range s {
if !seen[elem] {
result = append(result, elem)
}
}
return result
}
// SymmetricDiff 计算对称差集
func SymmetricDiff[T comparable](slices ...[]T) []T {
// 判断当前元素是否存在于其他切片中
containsAllNotMe := func(item T, idx int, slices ...[]T) bool {
for i, slice := range slices {
if i == idx {
continue
}
for _, val := range slice {
if val == item {
return true
}
}
}
return false
}
var result []T
for idx, slice := range slices {
for _, item := range slice {
if !containsAllNotMe(item, idx, slices...) {
result = append(result, item)
}
}
}
return Unique(result)
}
// Intersect 计算交集
func Intersect[T comparable](slices ...[]T) []T {
// 判断元素是否存在于其他切片中
containsAll := func(item T, slices [][]T) bool {
for _, slice := range slices {
if !In(item, slice) {
return false
}
}
return true
}
var result []T
for _, item := range slices[0] {
if containsAll(item, slices[1:]) {
result = append(result, item)
}
}
return Unique(result)
}