gitee.com/zhongguo168a/gocodes@v0.0.0-20230609140523-e1828349603f/datax/arrayx/arrayx.go (about) 1 package arrayx 2 3 func IndexOf(length int, predicate func(i int) bool) int { 4 for i := 0; i < length; i++ { 5 if predicate(i) { 6 return i 7 } 8 } 9 return -1 10 } 11 12 func RemoveAt(arr *[]interface{}, i int) { 13 s := *arr 14 copy(s[i:], s[i+1:]) 15 s[len(s)-1] = nil // GC 16 s2 := s[:len(s)-1] 17 *arr = s2 18 } 19 20 func Contains(length int, predicate func(i int) bool) bool { 21 for i := 0; i < length; i++ { 22 if predicate(i) { 23 return true 24 } 25 } 26 return false 27 } 28 29 func IndexOfInt(arr []int, item int) int { 30 var l = len(arr) 31 for i := 0; i < l; i++ { 32 if arr[i] == item { 33 return i 34 } 35 } 36 return -1 37 } 38 39 // 移除重复和空的值 40 func Unique(a []string) (ret []string) { 41 a_len := len(a) 42 for i := 0; i < a_len; i++ { 43 if (i > 0 && a[i-1] == a[i]) || len(a[i]) == 0 { 44 continue 45 } 46 ret = append(ret, a[i]) 47 } 48 return 49 } 50 51 // 通过两重循环过滤重复元素 52 func RemoveRepByLoop(slc []string) []string { 53 var result []string // 存放结果 54 for i := range slc { 55 flag := true 56 for j := range result { 57 if slc[i] == result[j] { 58 flag = false // 存在重复元素,标识为false 59 break 60 } 61 } 62 if flag { // 标识为false,不添加进结果 63 result = append(result, slc[i]) 64 } 65 } 66 return result 67 } 68 69 // 通过map主键唯一的特性过滤重复元素 70 func RemoveRepByMap(slc []string) []string { 71 var result []string 72 tempMap := map[string]byte{} // 存放不重复主键 73 for _, e := range slc { 74 l := len(tempMap) 75 tempMap[e] = 0 76 if len(tempMap) != l { // 加入map后,map长度变化,则元素不重复 77 result = append(result, e) 78 } 79 } 80 return result 81 } 82 83 // 元素去重 84 func RemoveRep(slc []string) []string { 85 if len(slc) < 1024 { 86 // 切片长度小于1024的时候,循环来过滤 87 return RemoveRepByLoop(slc) 88 } else { 89 // 大于的时候,通过map来过滤 90 return RemoveRepByMap(slc) 91 } 92 }