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  }