-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patharray.go
162 lines (142 loc) · 3.81 KB
/
array.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
package array
import (
"reflect"
"encoding/json"
)
/*
File name : array.go
Author : miaoyc
Create date : 2023/1/11 15:01
Update date : 2025/1/20 22:12
Description : array自定义函数,使用反射的函数有一定性能损耗(非核心高性能场景可以使用)
*/
// StructToJSON 是一个通用函数,可以将任何struct转换成JSON字符串
// 如果转换成功,返回JSON字符串和nil
// 如果转换失败,返回空字符串和错误信息
func StructToJSON(v interface{}) (string, error) {
jsonBytes, err := json.Marshal(v)
if err != nil {
return "", err
}
return string(jsonBytes), nil
}
// RemoveDuplicateElement 元素去重
func RemoveDuplicateElement(input interface{}) interface{} {
inputVal := reflect.ValueOf(input)
if inputVal.Kind() != reflect.Slice {
panic("RemoveDuplicateElement: input is not a slice")
}
resultVal := reflect.MakeSlice(inputVal.Type(), 0, inputVal.Len())
temp := map[interface{}]struct{}{}
for i := 0; i < inputVal.Len(); i++ {
item := inputVal.Index(i).Interface()
if _, ok := temp[item]; !ok {
temp[item] = struct{}{}
resultVal = reflect.Append(resultVal, inputVal.Index(i))
}
}
return resultVal.Interface()
}
// MergeAndDeduplicate 合并两个数组并去除重复项
func MergeAndDeduplicate[T comparable](a, b []T) []T {
unique := make(map[T]bool)
for _, item := range a {
unique[item] = true
}
for _, item := range b {
unique[item] = true
}
result := make([]T, 0, len(unique))
for key := range unique {
result = append(result, key)
}
return result
}
// In 类python的in操作符
func In[T comparable](slice []T, elem T) bool {
for _, item := range slice {
if item == elem {
return true
}
}
return false
}
// SliceEqual 判断两个切片是否相等
func SliceEqual(a, b interface{}) bool {
countElements := func(slice interface{}) map[interface{}]int {
count := make(map[interface{}]int)
switch slice := slice.(type) {
case []int:
for _, v := range slice {
count[v]++
}
case []string:
for _, v := range slice {
count[v]++
}
// 添加其他类型的判断,如 []float64 等
}
return count
}
mapEqual := func(a, b map[interface{}]int) bool {
return reflect.DeepEqual(a, b)
}
switch a := a.(type) {
case []int:
if b, ok := b.([]int); ok {
return mapEqual(countElements(a), countElements(b))
}
case []string:
if b, ok := b.([]string); ok {
return mapEqual(countElements(a), countElements(b))
}
// 添加其他类型的判断,如 []float64 等
}
return false
}
// UnionStringSlices 合并多个字符串切片并去重
// 参数:slices - 二维字符串切片
// 返回值:合并并去重后的字符串切片
// 返回结果无排序
func UnionStringSlices(slices [][]string) []string {
set := make(map[string]struct{})
for _, slice := range slices {
for _, item := range slice {
set[item] = struct{}{}
}
}
union := make([]string, 0, len(set))
for item := range set {
union = append(union, item)
}
return union
}
// MergeStringSlices 合并多个字符串切片并取交集
// 参数:slices - 二维字符串切片
// 返回值:合并并取交集后的字符串切片
func MergeStringSlices(slices [][]string) []string {
if len(slices) == 0 {
return []string{}
}
// 初始化交集集合为第一个切片的元素
intersection := make(map[string]struct{})
for _, item := range slices[0] {
intersection[item] = struct{}{}
}
// 逐个与后续切片取交集
for _, slice := range slices[1:] {
tempSet := make(map[string]struct{})
for _, item := range slice {
if _, exists := intersection[item]; exists {
tempSet[item] = struct{}{}
}
}
intersection = tempSet
}
// 将交集集合转换为切片
result := make([]string, 0, len(intersection))
for item := range intersection {
result = append(result, item)
}
return result
}