Golang 如何从Slice中删除重复值

Golang 如何从Slice中删除重复值

问题描述

在使用Golang编写程序时,我们经常需要对Slice(切片)进行操作。有时候,我们需要从Slice中删除重复的元素,保留唯一的值。那么,在Golang中如何实现这个功能呢?下面,本文将为大家详细介绍。

解决方案

删除Slice中重复元素的方法有很多,比如使用map来存储元素,使用双指针法遍历Slice等。本文将介绍两种方法:使用map的方法和使用双指针法的方法。具体操作如下。

方法一:使用map的方法

使用map的方法可以非常方便地实现删除Slice中重复元素的需求。我们只需要新建一个map,将Slice中的元素作为map的key,将map的value设为true即可。具体代码如下:

func RemoveDuplicateByMap(a []int) []int {
    result := []int{}
    m := make(map[int]bool)
    for _, item := range a {
        if _, ok := m[item]; !ok {
            m[item] = true
            result = append(result, item)
        }
    }
    return result
}

上述代码中,我们定义了一个新的Slice变量result来存储去重后的元素,同时声明了一个map,m用来存储元素。在遍历Slice时,如果当前元素不在map中,则将其添加到map中并追加到result中;否则跳过这个元素。

方法二:使用双指针法的方法

使用双指针法可以在不使用额外空间的情况下实现删除Slice中重复元素的需求。我们定义两个指针ij,让i从0开始遍历Slice中的元素,当a[i] != a[j]时,让j指针移动一个位置,并将a[j]设置为a[i]。具体代码如下:

func RemoveDuplicateByPointer(a []int) []int {
    j := 0
    for i := 1; i < len(a); i++ {
        if a[i] != a[j] {
            j++
            a[j] = a[i]
        }
    }
    return a[:j+1]
}

上述代码中,我们同样定义了一个新的Slice变量result,并使用双指针法将不同的元素保存到该变量中。

测试

为了验证删除Slice中重复元素的功能是否正常,我们可以编写以下测试代码:

package main

import (
    "fmt"
)

func RemoveDuplicateByMap(a []int) []int {
    result := []int{}
    m := make(map[int]bool)
    for _, item := range a {
        if _, ok := m[item]; !ok {
            m[item] = true
            result = append(result, item)
        }
    }
    return result
}

func RemoveDuplicateByPointer(a []int) []int {
    j := 0
    for i := 1; i < len(a); i++ {
        if a[i] != a[j] {
            j++
            a[j] = a[i]
        }
    }
    return a[:j+1]
}

func main() {
    a := []int{3, 4, 1, 2, 1, 5, 3, 7, 7}
    fmt.Println(RemoveDuplicateByMap(a))
    fmt.Println(RemoveDuplicateByPointer(a))
}

该测试代码将用上面介绍的两种方法去重Slice中的重复元素,并输出去重后的结果。执行该程序,输出结果如下:

[3 4 1 2 5 7]
[3 4 1 2 5 7]

可以看到,两种方法均正确去重了Slice中的重复元素。

结论

在Golang中,我们可以使用map或双指针法来实现删除Slice中重复元素的需求。使用map的方法适用于需要使用额外空间的场景,而使用双指针法需要在不使用额外空间的情况下去重,因此更适用于内存敏感的场景。根据实际情况选择适合的方法,可以实现高效的代码逻辑。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程