slice.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package slice
  2. func RemoveRepeatElement[T comparable](elements []T) []T {
  3. if elements == nil || len(elements) == 0 {
  4. return elements
  5. }
  6. result := make([]T, 0)
  7. tempMap := make(map[T]interface{})
  8. for _, element := range elements {
  9. l := len(tempMap)
  10. tempMap[element] = nil
  11. if len(tempMap) != l {
  12. result = append(result, element)
  13. }
  14. }
  15. return result
  16. }
  17. func RemoveRepeatElementByKey[T comparable, K comparable](elements []T, offerKeyFunc func(element T) K) []T {
  18. if elements == nil || len(elements) == 0 {
  19. return elements
  20. }
  21. result := make([]T, 0)
  22. tempMap := make(map[any]interface{})
  23. for _, element := range elements {
  24. var key any
  25. if offerKeyFunc == nil {
  26. key = element
  27. } else {
  28. key = offerKeyFunc(element)
  29. }
  30. l := len(tempMap)
  31. tempMap[key] = nil
  32. if len(tempMap) != l {
  33. result = append(result, element)
  34. }
  35. }
  36. return result
  37. }
  38. func ToMap[S any, K comparable, V any](slice []S, fn func(sliceValue S) (K, V, error)) (map[K]V, error) {
  39. m := make(map[K]V, len(slice))
  40. for _, v := range slice {
  41. key, value, err := fn(v)
  42. if err != nil {
  43. return nil, err
  44. }
  45. m[key] = value
  46. }
  47. return m, nil
  48. }
  49. func ExtractValue[T any, R any](s []T, addTo func(v T) (R, bool)) []R {
  50. retSlice := make([]R, 0)
  51. for _, v := range s {
  52. retValue, add := addTo(v)
  53. if add {
  54. retSlice = append(retSlice, retValue)
  55. }
  56. }
  57. return retSlice
  58. }
  59. func ExtractIntersectionValue[T comparable](aList, bList []T) []T {
  60. aList = RemoveRepeatElement(aList)
  61. bList = RemoveRepeatElement(bList)
  62. cList := make([]T, 0)
  63. tmpMap := make(map[T]int)
  64. for _, item := range aList {
  65. tmpMap[item] = 0
  66. }
  67. for _, item := range bList {
  68. if _, ok := tmpMap[item]; ok {
  69. cList = append(cList, item)
  70. }
  71. }
  72. return cList
  73. }
  74. func ExtractUnionValue[T comparable](aList, bList []T) []T {
  75. cList := make([]T, 0)
  76. cList = append(cList, aList...)
  77. cList = append(cList, bList...)
  78. cList = RemoveRepeatElement(cList)
  79. return cList
  80. }
  81. func ExtractASubBSetValue[T comparable](aList, bList []T) []T {
  82. aList = RemoveRepeatElement(aList)
  83. bList = RemoveRepeatElement(bList)
  84. cList := make([]T, 0)
  85. // 使用 map 标记 bList 中的元素
  86. tmpMap := make(map[T]struct{})
  87. for _, item := range bList {
  88. tmpMap[item] = struct{}{}
  89. }
  90. // 遍历 aList,将不在 bList 中的元素加入cList
  91. for _, item := range aList {
  92. if _, ok := tmpMap[item]; !ok {
  93. cList = append(cList, item)
  94. }
  95. }
  96. return cList
  97. }