array.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package array
  2. import (
  3. "github.com/spf13/cast"
  4. "strings"
  5. )
  6. func Join[T any](arg []T, str string) string {
  7. var ret strings.Builder
  8. for i, t := range arg {
  9. if i == 0 {
  10. ret.WriteString(cast.ToString(t))
  11. } else {
  12. ret.WriteString(str)
  13. ret.WriteString(cast.ToString(t))
  14. }
  15. }
  16. return ret.String()
  17. }
  18. // Unique 数组去重
  19. func Unique[T comparable](slice []T) []T {
  20. mp := map[T]bool{}
  21. for _, v := range slice {
  22. mp[v] = true
  23. }
  24. ret := []T{}
  25. for t, _ := range mp {
  26. ret = append(ret, t)
  27. }
  28. return ret
  29. }
  30. // Merge 求并集
  31. func Merge[T any](slice1, slice2 []T) []T {
  32. s1Len := len(slice1)
  33. slice3 := make([]T, s1Len+len(slice2))
  34. for i, t := range slice1 {
  35. slice3[i] = t
  36. }
  37. for i, t := range slice2 {
  38. slice3[s1Len+i] = t
  39. }
  40. return slice3
  41. }
  42. // Intersect 求交集
  43. func Intersect[T comparable](slice1, slice2 []T) []T {
  44. m := make(map[T]bool)
  45. nn := make([]T, 0)
  46. for _, v := range slice1 {
  47. m[v] = true
  48. }
  49. for _, v := range slice2 {
  50. exist, _ := m[v]
  51. if exist {
  52. nn = append(nn, v)
  53. }
  54. }
  55. return nn
  56. }
  57. // Difference 求差集 slice1-并集
  58. func Difference[T comparable](slice1, slice2 []T) []T {
  59. m := make(map[T]bool)
  60. nn := make([]T, 0)
  61. inter := Intersect(slice1, slice2)
  62. for _, v := range inter {
  63. m[v] = true
  64. }
  65. for _, value := range slice1 {
  66. exist, _ := m[value]
  67. if !exist {
  68. nn = append(nn, value)
  69. }
  70. }
  71. return nn
  72. }
  73. // InArray 判断元素是否在数组中
  74. func InArray[T comparable](needle T, haystack []T) bool {
  75. for _, t := range haystack {
  76. if needle == t {
  77. return true
  78. }
  79. }
  80. return false
  81. }