yjp 4 mesi fa
parent
commit
40ec4a5d8d
2 ha cambiato i file con 59 aggiunte e 0 eliminazioni
  1. 27 0
      slice/slice.go
  2. 32 0
      slice/slice_test.go

+ 27 - 0
slice/slice.go

@@ -19,6 +19,33 @@ func RemoveRepeatElement[T comparable](elements []T) []T {
 	return result
 }
 
+func RemoveRepeatElementByKey[T comparable, K comparable](elements []T, offerKeyFunc func(element T) K) []T {
+	if elements == nil || len(elements) == 0 {
+		return elements
+	}
+
+	result := make([]T, 0)
+	tempMap := make(map[any]interface{})
+	for _, element := range elements {
+		var key any
+
+		if offerKeyFunc == nil {
+			key = element
+		} else {
+			key = offerKeyFunc(element)
+		}
+
+		l := len(tempMap)
+		tempMap[key] = nil
+
+		if len(tempMap) != l {
+			result = append(result, element)
+		}
+	}
+
+	return result
+}
+
 func ToMap[S any, K comparable, V any](slice []S, fn func(sliceValue S) (K, V, error)) (map[K]V, error) {
 	m := make(map[K]V, len(slice))
 	for _, v := range slice {

+ 32 - 0
slice/slice_test.go

@@ -30,6 +30,38 @@ func TestRemoveRepeatElement(t *testing.T) {
 	}
 }
 
+func TestRemoveRepeatElementByKey(t *testing.T) {
+	type Person struct {
+		Name string
+		Age  int
+	}
+
+	personSlice := []Person{
+		{
+			Name: "test",
+			Age:  10,
+		},
+		{
+			Name: "test",
+			Age:  20,
+		},
+		{
+			Name: "test1",
+			Age:  30,
+		},
+	}
+
+	personSliceRemovedRepeatElement := RemoveRepeatElementByKey(personSlice, func(element Person) string {
+		return element.Name
+	})
+
+	if len(personSliceRemovedRepeatElement) != 2 ||
+		(personSliceRemovedRepeatElement[0].Name != "test" && personSliceRemovedRepeatElement[0].Age != 10) ||
+		personSliceRemovedRepeatElement[1].Name != "test1" && personSliceRemovedRepeatElement[1].Age != 30 {
+		t.Fatal("slice移除元素后不正确")
+	}
+}
+
 func TestToMap(t *testing.T) {
 	testSlice := []string{"1::one", "2::two"}
 	resultMap, err := ToMap(testSlice, func(v string) (int, string, error) {