怎么在golang中对slice元素去重?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
golang 是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言,其语法与 C语言相近,但并不包括如枚举、异常处理、继承、泛型、断言、虚函数等功能。
// 通过两重循环过滤重复元素
func RemoveRepByLoop(slc []int) []int {
result := []int{} // 存放结果
for i := range slc{
flag := true
for j := range result{
if slc[i] == result[j] {
flag = false // 存在重复元素,标识为false
break
}
}
if flag { // 标识为false,不添加进结果
result = append(result, slc[i])
}
}
return result
}
因为字典的主键唯一,所以可以用来判断元素是否重复
// 通过map主键唯一的特性过滤重复元素
func RemoveRepByMap(slc []int) []int {
result := []int{}
tempMap := map[int]byte{} // 存放不重复主键
for _, e := range slc{
l := len(tempMap)
tempMap[e] = 0
if len(tempMap) != l{ // 加入map后,map长度变化,则元素不重复
result = append(result, e)
}
}
return result
}
ps : 这里为了节省内存,使用map[int]byte。 因为map的value并没有用到,所以什么类型都可以。
// 元素去重
func RemoveRep(slc []int) []int{
if len(slc) < 1024 {
// 切片长度小于1024的时候,循环来过滤
return RemoveRepByLoop(slc)
}else{
// 大于的时候,通过map来过滤
return RemoveRepByMap(slc)
}
}
ps:1024 这个数字不是特别精准,我是使用go test 的基准测试,手工的比较的。
大约在这个数量超上,使用map方式的速度要快,小于这个数量级后,loop方式要快,而且省内存。
补充:Golang数组去重&切片去重
定义一个新切片(数组),存放原数组的第一个元素,然后将新切片(数组)与原切片(数组)的元素一一对比,如果不同则存放在新切片(数组)中。
package main
import "fmt"
func main() {
var arr = []string{"hello", "hi", "world", "hi", "china", "hello", "hi"}
fmt.Println(RemoveRepeatedElement(arr))
}
func RemoveRepeatedElement(arr []string) (newArr []string) {
newArr = make([]string, 0)
for i := 0; i < len(arr); i++ {
repeat := false
for j := i + 1; j < len(arr); j++ {
if arr[i] == arr[j] {
repeat = true
break
}
}
if !repeat {
newArr = append(newArr, arr[i])
}
}
return
}
先将原切片(数组)进行排序,在将相邻的元素进行比较,如果不同则存放在新切片(数组)中。
package main
import "fmt"
func main() {
var arr = []string{"hello", "hi", "world", "hi", "china", "hello", "hi"}
fmt.Println(RemoveRepeatedElement(arr))
}
func RemoveRepeatedElement(arr []string) (newArr []string) {
newArr = make([]string, 0)
sort.Strings(arr)
for i := 0; i < len(arr); i++ {
repeat := false
for j := i + 1; j < len(arr); j++ {
if arr[i] == arr[j] {
repeat = true
break
}
}
if !repeat {
newArr = append(newArr, arr[i])
}
}
return
}
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。