当前位置: 首页 > news >正文

【go】slice元素去重

在 Go 语言中,slice(切片)本身没有内置的去重方法,但可以通过一些常见的方法手动实现去重。以下是几种常用的去重方式,以及它们的优缺点和适用场景。

一、使用 map 去重(推荐)

利用 map 的键唯一性,可以高效地对 slice 进行去重。这种方法的时间复杂度为 O(n),适用于大多数场景。

示例代码:
package main
import "fmt"
func removeDuplicates(nums []int) []int {seen := make(map[int]bool)result := []int{}for _, num := range nums {if !seen[num] {seen[num] = trueresult = append(result, num)}}return result
}
func main() {nums := []int{1, 2, 2, 3, 4, 4, 5}uniqueNums := removeDuplicates(nums)fmt.Println(uniqueNums) // 输出: [1 2 3 4 5]
}
优点:
  • 时间复杂度为 O(n),效率高。
  • 适用于任何可比较的类型(如 intstring 等)。
缺点:
  • 需要额外的空间存储 map。

二、使用双重循环去重

如果不希望使用额外的空间,可以通过双重循环的方式去重。这种方法的时间复杂度为 O(n²),适用于小规模数据。

示例代码:
package main
import "fmt"
func removeDuplicates(nums []int) []int {result := []int{}for _, num := range nums {duplicate := falsefor _, v := range result {if num == v {duplicate = truebreak}}if !duplicate {result = append(result, num)}}return result
}
func main() {nums := []int{1, 2, 2, 3, 4, 4, 5}uniqueNums := removeDuplicates(nums)fmt.Println(uniqueNums) // 输出: [1 2 3 4 5]
}
优点:
  • 不需要额外的空间存储 map。
  • 适用于小规模数据。
缺点:
  • 时间复杂度为 O(n²),效率较低,不适合大规模数据。

三、使用 sort.Slice + 遍历去重

如果 slice 是有序的,或者可以接受排序后的结果,可以先对 slice 排序,然后遍历去重。这种方法的时间复杂度为 O(n log n)(排序) + O(n)(遍历) = O(n log n)。

示例代码:
package main
import ("fmt""sort"
)
func removeDuplicates(nums []int) []int {if len(nums) == 0 {return nums}sort.Ints(nums) // 排序result := []int{nums[0]}for i := 1; i < len(nums); i++ {if nums[i] != nums[i-1] {result = append(result, nums[i])}}return result
}
func main() {nums := []int{1, 2, 2, 3, 4, 4, 5}uniqueNums := removeDuplicates(nums)fmt.Println(uniqueNums) // 输出: [1 2 3 4 5]
}
优点:
  • 适用于需要排序后去重的场景。
  • 时间复杂度比双重循环低。
缺点:
  • 会改变原始 slice 的顺序。
  • 需要排序操作,可能不适用于所有场景。

四、使用第三方库

如果项目中允许使用第三方库,可以使用一些现成的工具库(如 github.com/samber/lo)来简化去重操作。

示例代码:
package main
import ("fmt""github.com/samber/lo"
)
func main() {nums := []int{1, 2, 2, 3, 4, 4, 5}uniqueNums := lo.Uniq(nums)fmt.Println(uniqueNums) // 输出: [1 2 3 4 5]
}
优点:
  • 代码简洁,适合快速开发。
  • 支持多种数据类型和复杂操作。
缺点:
  • 需要引入第三方库,可能增加项目依赖。

五、去重方法的对比

方法时间复杂度空间复杂度是否改变顺序适用场景
map 去重O(n)O(n)不改变通用场景,推荐
双重循环去重O(n²)O(1)不改变小规模数据,无额外空间
sort + 遍历去重O(n log n)O(1)改变需要排序后去重
第三方库(如 lo)O(n)O(n)不改变快速开发,允许依赖

六、总结

  • 推荐使用 map 去重:这是最通用且高效的方法,适用于大多数场景。
  • 小规模数据:可以使用双重循环去重,避免额外空间开销。
  • 需要排序后去重:可以使用 sort.Slice + 遍历 的方式。
  • 快速开发:如果允许使用第三方库,可以选择 lo.Uniq 等工具。
    根据实际需求选择合适的方法,可以在保证性能的同时简化代码逻辑。
http://www.dtcms.com/a/309893.html

相关文章:

  • MonoGame游戏开发框架日记 -07
  • 【Go】P1 GoLang 语言简介与起源
  • iPhone 恢复出厂设置是否会删除所有内容?
  • 充电桩车位占用识别准确率↑32%:陌讯动态特征融合算法实战解析
  • STM32 使用 RTC 实现实时时钟功能
  • tauri实用教程:项目打包为安装包时如何包含其他文件
  • InfluxDB 与 Golang 框架集成:Gin 实战指南(一)
  • 噪声对比估计(NCE):原理、演进与跨领域应用
  • 第一个大语言模型的微调
  • 电路基础学习
  • 字节跳动招机器人数据算法研究员-Top Seed
  • 开源医院信息管理系统:基于若依框架的智慧医疗解决方案
  • Chrontel【CH7219A-BF】CH7219A USB-C和DP 1.4至HDMI 2.1协议转换器,带DSC解码功能
  • [2025CVPR-图象生成方向]ODA-GAN:由弱监督学习辅助的正交解耦比对GAN 虚拟免疫组织化学染色
  • 【Mysql】联合索引生效分析案例
  • 新手小白如何快速检测IP 的好坏?
  • AI有限元、聚合物复合材料多尺度建模材料性能预测及大模型应用实践,打破传统研发模式!
  • 【跨国数仓迁移最佳实践4】MaxCompute 企业级能力升级:跨域访问控制与数据安全特性增强
  • Apache RocketMQ中 Normal Message(普通消息)的说明
  • LRU缓存淘汰算法的详细介绍与具体实现
  • 智能体之外部工具篇(2)
  • SpringBoot英语学习系统开发实战
  • TOGAF指南1
  • JavaWeb--Student2025项目:条件查询、批量删除、新增、修改
  • a=b、深拷贝和浅拷贝
  • pycharm快捷键设置为和vscode一样
  • 日志管理工具 ——Graylog
  • 外卖“0元购”退场后,即时零售大战才刚开始
  • 一个可以检测本机的字节顺序,并对任意数据进行字节顺序的反转操作的代码。
  • 学习设计模式《二十》——解释器模式