4 回答

TA贡献2051条经验 获得超10个赞
我发现Burak和Fazlan的解决方案很有帮助。基于此,我实现了简单的函数,这些函数有助于使用通用方法从字符串,整数或任何其他类型的切片中删除或筛选重复数据。
这是我的三个函数,第一个是泛型的,第二个是字符串,最后一个是切片的整数。您必须传递数据并返回所有唯一值作为结果。
通用解决方案:=> Go v1.18
func removeDuplicate[T string | int](sliceList []T) []T {
allKeys := make(map[T]bool)
list := []T{}
for _, item := range sliceList {
if _, value := allKeys[item]; !value {
allKeys[item] = true
list = append(list, item)
}
}
return list
}
从切片中删除重复字符串:
func removeDuplicateStr(strSlice []string) []string {
allKeys := make(map[string]bool)
list := []string{}
for _, item := range strSlice {
if _, value := allKeys[item]; !value {
allKeys[item] = true
list = append(list, item)
}
}
return list
}
从切片中删除重复的整数:
func removeDuplicateInt(intSlice []int) []int {
allKeys := make(map[int]bool)
list := []int{}
for _, item := range intSlice {
if _, value := allKeys[item]; !value {
allKeys[item] = true
list = append(list, item)
}
}
return list
}
您可以更新切片类型,它将筛选出所有类型切片的所有重复数据。
以下是GoPlayground链接:https://go.dev/play/p/iyb97KcftMa

TA贡献1841条经验 获得超3个赞
您可以使用地图进行就地替换:
processed := map[string]struct{}{}
w := 0
for _, s := range cities {
if _, exists := processed[s]; !exists {
// If this city has not been seen yet, add it to the list
processed[s] = struct{}{}
cities[w] = s
w++
}
}
cities = cities[:w]

TA贡献1828条经验 获得超4个赞
但是,添加这个对我有用的答案确实需要/包括排序。
func removeDuplicateStrings(s []string) []string {
if len(s) < 1 {
return s
}
sort.Strings(s)
prev := 1
for curr := 1; curr < len(s); curr++ {
if s[curr-1] != s[curr] {
s[prev] = s[curr]
prev++
}
}
return s[:prev]
}
为了好玩,我尝试使用泛型!(仅限 Go 1.18+)
type SliceType interface {
~string | ~int | ~float64 // add more *comparable* types as needed
}
func removeDuplicates[T SliceType](s []T) []T {
if len(s) < 1 {
return s
}
// sort
sort.SliceStable(s, func(i, j int) bool {
return s[i] < s[j]
})
prev := 1
for curr := 1; curr < len(s); curr++ {
if s[curr-1] != s[curr] {
s[prev] = s[curr]
prev++
}
}
return s[:prev]
}
Go Playground Link with tests: https://go.dev/play/p/bw1PP1osJJQ

TA贡献1862条经验 获得超6个赞
简单易懂。
func RemoveDuplicate(array []string) []string {
m := make(map[string]string)
for _, x := range array {
m[x] = x
}
var ClearedArr []string
for x, _ := range m {
ClearedArr = append(ClearedArr, x)
}
return ClearedArr
}
- 4 回答
- 0 关注
- 178 浏览
添加回答
举报