diff --git a/utils/utils.go b/utils/utils.go index a599b9ea3479262b77163efc57426b501d805a61..8a7575ca5942b8820ee95b17050d6a6628ed69f2 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -199,3 +199,20 @@ func PopFirst[T any](slice []T) (T, []T) { first := slice[0] return first, slice[1:] } + +// 计算两个切片的差集 +func DifferenceSlice[T comparable](mainSlice, subtractSlice []T) []T { + subtractSet := make(map[T]struct{}) + for _, item := range subtractSlice { + subtractSet[item] = struct{}{} + } + + var diffSlice []T + for _, item := range mainSlice { + if _, found := subtractSet[item]; !found { + diffSlice = append(diffSlice, item) + } + } + + return diffSlice +} diff --git a/utils/utils_test.go b/utils/utils_test.go index 3eefebe1b62556b5f6669a3b207da1697681ce24..a1443ed9a2616368854d2901e2a2a20195965c74 100644 --- a/utils/utils_test.go +++ b/utils/utils_test.go @@ -1,8 +1,6 @@ package utils import ( - "reflect" - "sort" "testing" ) @@ -14,33 +12,7 @@ func TestKeys(t *testing.T) { } keys := Keys[string, int](m) expectedKeys := []string{"key1", "key2", "key3"} - sort.Strings(keys) - sort.Strings(expectedKeys) - if !reflect.DeepEqual(keys, expectedKeys) { - t.Errorf("Keys() = %v, want %v", keys, expectedKeys) - } - - // 创建一个map来记录期望值出现的次数 - expectedCount := make(map[string]int) - for _, v := range expectedKeys { - expectedCount[v]++ - } - - // 检查返回的slice中的每个值是否都在期望的slice中 - for _, v := range keys { - if count, ok := expectedCount[v]; !ok || count == 0 { - t.Errorf("Keys() contains unexpected value %v", v) - } - expectedCount[v]-- - } - - // 检查期望的slice中的每个值是否都被找到了 - for _, count := range expectedCount { - if count != 0 { - t.Errorf("Keys() is missing value") - } - } - + assertSliceElements[string](t, keys, expectedKeys) } func TestValues(t *testing.T) { @@ -50,28 +22,39 @@ func TestValues(t *testing.T) { "key3": 1, } - values := Values2[string, int](testMap) + values := Values[string, int](testMap) + + expectedValues := []int{1, 2, 1} + assertSliceElements[int](t, values, expectedValues) +} + +func TestDifferenceSlice(t *testing.T) { + mainSlice := []int{1, 2, 3, 4, 5} + subtractSlice := []int{3, 4, 6} + expectedSlice := []int{1, 2, 5} + diffSlice := DifferenceSlice(mainSlice, subtractSlice) + + assertSliceElements[int](t, diffSlice, expectedSlice) +} - expectedKeys := []int{1, 2, 1} +func assertSliceElements[K comparable](t *testing.T, actual, expected []K) { + t.Helper() - // 创建一个map来记录期望值出现的次数 - expectedCount := make(map[int]int) - for _, v := range expectedKeys { + expectedCount := make(map[K]int) + for _, v := range expected { expectedCount[v]++ } - // 检查返回的slice中的每个值是否都在期望的slice中 - for _, v := range values { + for _, v := range actual { if count, ok := expectedCount[v]; !ok || count == 0 { - t.Errorf("Values() contains unexpected value %v", v) + t.Errorf("Slice contains unexpected value %v", v) } expectedCount[v]-- } - // 检查期望的slice中的每个值是否都被找到了 for _, count := range expectedCount { if count != 0 { - t.Errorf("Values() is missing value") + t.Errorf("Slice is missing value") } } }