github.com/lianghucheng/zrddz@v0.0.0-20200923083010-c71f680932e2/src/common/array.go (about) 1 package common 2 3 import ( 4 "math/rand" 5 "time" 6 ) 7 8 func init() { 9 rand.Seed(time.Now().UnixNano()) 10 } 11 12 func Shuffle(a []int) []int { 13 n := len(a) 14 if n == 0 { 15 return a 16 } 17 b := make([]int, n) 18 19 m := rand.Perm(n) 20 for i := 0; i < n; i++ { 21 b[i] = a[m[i]] 22 } 23 return b 24 } 25 26 func Index(a []int, sep int) int { 27 n := len(a) 28 for i := 0; i < n; i++ { 29 if a[i] == sep { 30 return i 31 } 32 } 33 return -1 34 } 35 36 // 判断 value 是否在 array 中 37 func InArray(a []int, sep int) bool { 38 for _, v := range a { 39 if sep == v { 40 return true 41 } 42 } 43 return false 44 } 45 46 // 从 array 中移除最开始出现的 sep 47 func RemoveOnce(a []int, sep int) []int { 48 i := Index(a, sep) 49 if i == -1 { 50 return a 51 } 52 b := make([]int, 0) 53 if i == 0 { 54 b = append(b, a[1:]...) 55 } else if i == len(a)-1 { 56 b = append(b, a[:i]...) 57 } else { 58 b = append(b, a[:i]...) 59 b = append(b, a[i+1:]...) 60 } 61 return b 62 } 63 64 // 从 array 中移除所有的 sep 65 func RemoveAll(a []int, sep int) []int { 66 b := make([]int, 0) 67 for _, v := range a { 68 if v != sep { 69 b = append(b, v) 70 } 71 } 72 return b 73 } 74 75 func Remove(a []int, sub []int) []int { 76 b := append([]int{}, a...) 77 for _, v := range sub { 78 b = RemoveOnce(b, v) 79 } 80 return b 81 } 82 83 func ReplaceAll(a []int, old, new int) []int { 84 if old == new { 85 return a 86 } 87 if InArray(a, old) { 88 b := make([]int, 0) 89 for _, v := range a { 90 if old == v { 91 b = append(b, new) 92 } else { 93 b = append(b, v) 94 } 95 } 96 return b 97 } 98 return a 99 } 100 101 func Deduplicate(a []int) []int { 102 n := len(a) 103 if n == 0 { 104 return a 105 } 106 m := make(map[int]bool) 107 108 b := []int{a[0]} 109 m[a[0]] = true 110 for i := 1; i < n; i++ { 111 if !m[a[i]] { 112 b = append(b, a[i]) 113 m[a[i]] = true 114 } 115 } 116 return b 117 } 118 119 // 比较两个数组的元素是否相等 120 func Equal(x, y []int) bool { 121 if len(x) == len(y) { 122 return Contain(x, y) 123 } 124 return false 125 } 126 127 func Contain(x, y []int) bool { 128 if len(x) < len(y) { 129 return false 130 } 131 temp := Deduplicate(y) 132 for _, v := range temp { 133 if Count(x, v) < Count(y, v) { 134 return false 135 } 136 } 137 return true 138 } 139 140 func Count(a []int, sep int) int { 141 count := 0 142 for _, v := range a { 143 if sep == v { 144 count++ 145 } 146 } 147 return count 148 }