当前位置: 代码网 > it编程>前端脚本>Golang > go语言切片去重的3种方式

go语言切片去重的3种方式

2024年09月08日 Golang 我要评论
go语言中的切片是使用非常频繁的一个数据结构,对于他的去重,我们可以有以下3种方式1. 切片slice去重利用map的key不能重复的特性+append函数 一次for循环搞定这个模式时间复杂度最低,

go语言中的切片是使用非常频繁的一个数据结构,对于他的去重,我们可以有以下3种方式

1. 切片slice去重

利用map的key不能重复的特性+append函数  一次for循环搞定

这个模式时间复杂度最低,效率最高, 如果go版本大于1.21推荐使用这种方式的泛型参数版本

// 改进版的slice去重
func uniquesliceint64(ss []int64) []int64 {
	newss := make([]int64, 0)  // 返回的新切片
	m1 := make(map[int64]byte) //用来去重的临时map
	for _, v := range ss {
		if _, ok := m1[v]; !ok {
			m1[v] = 1
			newss = append(newss, v)
		}
	}
	return newss
}

泛型参数版本,需要go版本大于1.21 否则不能使用泛型参数

// 切片去重升级版 泛型参数 利用map的key不能重复的特性+append函数  一次for循环搞定
func unique[t cmp.ordered](ss []t) []t {
	size := len(ss)
	if size == 0 {
		return []t{}
	}
	newslices := make([]t, 0) //这里新建一个切片,大于为0, 因为我们不知道有几个非重复数据,后面都使用append来动态增加并扩容
	m1 := make(map[t]byte)
	for _, v := range ss {
		if _, ok := m1[v]; !ok { //如果数据不在map中,放入
			m1[v] = 1                        // 保存到map中,用于下次判断
			newslices = append(newslices, v) // 将数据放入新的切片中
		}
	}
	return newslices
}

2. 切片去重

利用map的key不能重复的特性 2次for循环

下面这个使用了泛型参数

//go版本大于1.21的情况,可以使用泛型参数

// 切片去重  泛型参数 利用map的key不能重复的特性 2次for循环
func unique1[t cmp.ordered](ss []t) []t {
	size := len(ss)
	if size == 0 {
		return []t{}
	}
	// 这个地方利用了map数据的key不能重复的特性,将切片的值当做key放入map中,达到去重的目的
	m1 := make(map[t]byte)
	for i := 0; i < size; i++ {
		m1[ss[i]] = 1
	}
	// 创建一个切片,长度为去重后的数据长度
	newss := make([]t, len(m1))
	idx := 0
	for key := range m1 { // 循环map, 将key放入到切片中
		newss[idx] = key
		idx++
	}
	return newss
}

cmp.ordered泛型参数约束接口参考    注意上面的泛型参数约束 cmp.ordered 是一个专门用于泛型类型约束的接口定义, 需要go版本大于1.21才能使用

type ordered interface {
    ~int | ~int8 | ~int16 | ~int32 | ~int64 |
        ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr |
        ~float32 | ~float64 |
        ~string
}

3. 切片去重

双层for循环模式

这种方式方式直观,但是时间复杂度较高!

// 切片去重 双层for循环模式
func unique0(ss []int64) (newss []int64) {
	newss = make([]int64, 0)
	for i := 0; i < len(ss); i++ {
		repeat := false
		for j := i + 1; j < len(ss); j++ {
			if ss[i] == ss[j] {
				repeat = true
				break
			}
		}
		if !repeat {
			newss = append(newss, ss[i])
		}
	}
	return
}

总结

对于golang的切片去重,效率最高的方式为map+append函数的方式,因为他们的时间复杂度是最低的,对于go版本大于1.21的推荐使用泛型参数的切片去重,这样一个函数就可以解决所有类型的切片去重问题,高效精简! 

到此这篇关于go语言切片去重的3种方式 的文章就介绍到这了,更多相关go语言切片去重内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com