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中重复元素的需求。我们定义两个指针i
和j
,让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的方法适用于需要使用额外空间的场景,而使用双指针法需要在不使用额外空间的情况下去重,因此更适用于内存敏感的场景。根据实际情况选择适合的方法,可以实现高效的代码逻辑。