76 lines
2.0 KiB
Go
76 lines
2.0 KiB
Go
package array
|
|
|
|
func Diff[T comparable](slice1, slice2 []T) []T {
|
|
var result []T
|
|
|
|
elementsMap := make(map[T]bool)
|
|
for _, v := range slice2 {
|
|
elementsMap[v] = true
|
|
}
|
|
|
|
for _, v := range slice1 {
|
|
if !elementsMap[v] {
|
|
result = append(result, v)
|
|
}
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
func MapDiff[T comparable](slice1, slice2 []T) []T {
|
|
var result []T
|
|
|
|
arr1elementsMap := make(map[T]int)
|
|
for _, v := range slice1 {
|
|
arr1elementsMap[v] += 1
|
|
}
|
|
|
|
arr2elementsMap := make(map[T]int)
|
|
for _, v := range slice2 {
|
|
arr2elementsMap[v] += 1
|
|
}
|
|
|
|
for key, count1 := range arr1elementsMap {
|
|
if count2, ok := arr2elementsMap[key]; !ok || count2 != count1 {
|
|
result = append(result, key)
|
|
}
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
// DiffByKeyAndValue returns the elements from slice1 that do not have
|
|
// corresponding elements in slice2 based on a key and a comparison function.
|
|
// T1 and T2 are the types of the elements in slice1 and slice2 respectively.
|
|
// K is the type of the key used for comparison.
|
|
func DiffByKeyAndValue[T1 any, T2 any, K comparable](
|
|
slice1 []T1,
|
|
slice2 []T2,
|
|
getKeyFromSlice1 func(T1) K,
|
|
getKeyFromSlice2 func(T2) K,
|
|
compare func(T1, T2) bool,
|
|
) []T1 {
|
|
// Create a map to index elements of slice2 by their keys
|
|
indexedSlice2 := make(map[K]T2)
|
|
for _, elementFromSlice2 := range slice2 {
|
|
key := getKeyFromSlice2(elementFromSlice2)
|
|
indexedSlice2[key] = elementFromSlice2
|
|
}
|
|
|
|
// Initialize a slice to hold the elements that are different
|
|
var differingElements []T1
|
|
|
|
// Iterate over slice1 and find elements that are not in slice2
|
|
for _, elementFromSlice1 := range slice1 {
|
|
key := getKeyFromSlice1(elementFromSlice1)
|
|
|
|
// Check if the key exists in the indexed slice2
|
|
if correspondingElementFromSlice2, exists := indexedSlice2[key]; !exists || !compare(elementFromSlice1, correspondingElementFromSlice2) {
|
|
// If it doesn't exist or the comparison fails, add to the result
|
|
differingElements = append(differingElements, elementFromSlice1)
|
|
}
|
|
}
|
|
|
|
return differingElements
|
|
}
|