slice.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. package utility
  2. import "fmt"
  3. func Remove(sl []interface{}, f func(v1 interface{}) bool) []interface{} {
  4. for k, v := range sl {
  5. if f(v) {
  6. sl[k] = sl[len(sl)-1]
  7. sl = sl[:len(sl)-1]
  8. return sl
  9. }
  10. }
  11. return sl
  12. }
  13. func InSlice[K comparable](src []K, sub K) bool {
  14. for _, v := range src {
  15. if v == sub {
  16. return true
  17. }
  18. }
  19. return false
  20. }
  21. func RemoveSlice[K comparable](src []K, sub K) []K {
  22. for k, v := range src {
  23. if v == sub {
  24. copy(src[k:], src[k+1:])
  25. return src[:len(src)-1]
  26. }
  27. }
  28. return src
  29. }
  30. func RemoveSliceFast[K comparable](src []K, sub K) []K {
  31. for k, v := range src {
  32. if v == sub {
  33. src[k] = src[len(src)-1]
  34. return src[:len(src)-1]
  35. }
  36. }
  37. return src
  38. }
  39. func RemoveOneFromSlice[K any](src []K, cmp func(K) bool) []K {
  40. for k, v := range src {
  41. if cmp(v) {
  42. copy(src[k:], src[k+1:])
  43. return src[:len(src)-1]
  44. }
  45. }
  46. return src
  47. }
  48. // 切片相减
  49. // [1,1,2,3] - [1,1,2,4] = [3]
  50. func SubSlice[K comparable](src []K, sub []K) []K {
  51. // 组织MAP表
  52. subMap := make(map[K]int, len(sub))
  53. for _, v := range sub {
  54. subMap[v] += 1
  55. }
  56. remove := func(val K) bool {
  57. v, ok := subMap[val]
  58. if !ok {
  59. return false
  60. }
  61. if v > 1 {
  62. subMap[val] -= 1
  63. } else {
  64. delete(subMap, val)
  65. }
  66. return true
  67. }
  68. index := 0
  69. for _, v := range src {
  70. if remove(v) {
  71. continue
  72. }
  73. src[index] = v
  74. index += 1
  75. }
  76. src = src[:index]
  77. return src
  78. }
  79. // 切片比较
  80. // [1,2,3] == [1,2,4] = -1
  81. // [1,2,3] == [1,3,2] = 0
  82. // [1,2,3] == [1,2,3] = 1
  83. func CompareSlice[K comparable](p1 []K, p2 []K) int {
  84. // 长度不等直接-1
  85. if len(p1) != len(p2) {
  86. return -1
  87. }
  88. // 逐个比较每个相等则为1
  89. allEq := true
  90. for k, v := range p1 {
  91. if v != p2[k] {
  92. allEq = false
  93. break
  94. }
  95. }
  96. if allEq {
  97. return 1
  98. }
  99. // 个数统计,每个相等则为0
  100. p1Nums := make(map[K]int)
  101. for _, v := range p1 {
  102. p1Nums[v] += 1
  103. }
  104. p2Nums := make(map[K]int)
  105. for _, v := range p2 {
  106. p2Nums[v] += 1
  107. }
  108. if len(p1Nums) != len(p2Nums) {
  109. return -1
  110. }
  111. for k, v := range p1Nums {
  112. n := p2Nums[k]
  113. if n != v {
  114. return -1
  115. }
  116. }
  117. return 0
  118. }
  119. // k,v相等返回true;否则返回false
  120. // [K comparable, V comparable]
  121. func CompareMap[K comparable, V comparable](p1 map[K]V, p2 map[K]V) bool {
  122. //长度不等则为-1
  123. if len(p1) != len(p2) {
  124. return false
  125. }
  126. for k, v := range p1 {
  127. n, ok := p2[k]
  128. if !ok {
  129. return false
  130. }
  131. if n != v {
  132. return false
  133. }
  134. }
  135. return true
  136. }
  137. func TestSlice() {
  138. //[1,1,2,3] - [1,1,2,4] = [3]
  139. fmt.Println(SubSlice([]int{1, 1, 2, 3}, []int{1, 1, 2, 4}))
  140. fmt.Println(SubSlice([]int{1, 1, 2, 3}, []int{}))
  141. fmt.Println(SubSlice([]int{}, []int{1, 1, 2, 4}))
  142. }