为了账号安全,请及时绑定邮箱和手机立即绑定

如何从 Go 中的切片中删除重复的字符串或整型

如何从 Go 中的切片中删除重复的字符串或整型

Go
互换的青春 2022-08-15 19:14:13
假设我有一个学生城市列表,它的大小可能是100或1000,我想过滤掉所有重复的城市。我想要一个通用解决方案,可用于从任何切片中删除所有重复的字符串。我是Go语言的新手,所以我试图通过循环并使用另一个循环函数检查元素是否存在来做到这一点。学生城市列表(数据):studentsCities := []string{"Mumbai", "Delhi", "Ahmedabad", "Mumbai", "Bangalore", "Delhi", "Kolkata", "Pune"}我创建的函数,它正在做这项工作:func contains(s []string, e string) bool {    for _, a := range s {        if a == e {            return true        }    }    return false}func removeDuplicates(strList []string) []string {    list := []string{}    for _, item := range strList {        fmt.Println(item)        if contains(list, item) == false {            list = append(list, item)        }    }    return list}我的解决方案测试func main() {    studentsCities := []string{"Mumbai", "Delhi", "Ahmedabad", "Mumbai", "Bangalore", "Delhi", "Kolkata", "Pune"}    uniqueStudentsCities := removeDuplicates(studentsCities)        fmt.Println(uniqueStudentsCities) // Expected output [Mumbai Delhi Ahmedabad Bangalore Kolkata Pune]}我认为我尝试的上述解决方案不是最佳解决方案。因此,我需要你们的帮助来建议从切片中删除重复项的最快方法?我检查了StackOverflow,这个问题还没有被问到,所以我没有得到任何解决方案。
查看完整描述

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


查看完整回答
反对 回复 2022-08-15
?
偶然的你

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]


查看完整回答
反对 回复 2022-08-15
?
明月笑刀无情

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


查看完整回答
反对 回复 2022-08-15
?
阿波罗的战车

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

}


查看完整回答
反对 回复 2022-08-15
  • 4 回答
  • 0 关注
  • 178 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号