golang 字符串切片去重实例
作者:天天water 发布时间:2024-02-20 04:00:53
实现目的:实现字符串切片去重,只是两个字符完全相同时,去除一个。
实现方式:考虑两种,一种是常规的双重循环去除,另一种是利用map的key的唯一性实现。
1、通过双重循环来过滤重复元素
方法1,
思路:利用for双重循环,新建一个slice,遍历原slice中的每一个元素,每一次判断这个元素和后面元素是否相同,若相同则去除,若不同则存入新slice中,判断本元素后,再继续判断下一个元素,直到判断完毕。
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 newArr
}
方法2,
思路:先对原slice使用sort进行排序,后面思路同方法1。
package main
import(
"fmt"
"sort"
)
//去除重复字符串和空格
func RemoveDuplicatesAndEmpty(a []string) (ret []string){
a_len := len(a)
for i:=0; i < a_len; i++{
if (i > 0 && a[i-1] == a[i]) || len(a[i])==0{
continue;
}
ret = append(ret, a[i])
}
return
}
func main(){
a := []string{"hello", "", "world", "yes", "hello", "nihao", "shijie", "hello", "yes", "nihao","good"}
sort.Strings(a)
fmt.Println(a)
fmt.Println(RemoveDuplicatesAndEmpty(a))
}
2、通过字典来过滤
思路:因为字典的主键唯一,所以可以用来判断元素是否重复。
package main
import (
"fmt"
)
func main() {
testStr := make([]string, 0)
testStr = append(testStr, "haha", "hehe", "hoho", "hehe")
afterStr := removeDuplicate(testStr)
fmt.Println(afterStr)
}
// 通过map主键唯一的特性过滤重复元素
func removeDuplicate(arr []string) []string {
resArr := make([]string, 0)
tmpMap := make(map[string]interface{})
for _, val := range arr {
//判断主键为val的map是否存在
if _, ok := tmpMap[val]; !ok {
resArr = append(resArr, val)
tmpMap[val] = nil
}
}
return resArr
}
3、效率考虑
程序算法有两个指标:运行时间、内存消耗(即:时间复杂度、空间复杂度)。
以上两个方法,当数据量小和数据量大时分别考虑用双重for循环方法和map主键唯一方法。具体需要数据验证。
补充:Golang中如何删除切片的重复元素
思想如下:利用map中key唯一的特性将slice中的数据保存到map的key中
但是要注意key的类型,有些数值不能做为key
Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。
Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的
Golang中map中key的类型
golang中的map,其中的 key 可以是很多种类型,比如 bool, 数字,string, 指针, channel , 还有只包含前面几个类型的 interface types, structs, arrays
显然,slice, map 还有 function 是不可以了,因为这几个没法用 == 来判断
原文如下:
As mentioned earlier, map keys may be of any type that is comparable. The language spec defines this precisely, but in short, comparable types are boolean, numeric, string, pointer, channel, and interface types, and structs or arrays that contain only those types. Notably absent from the list are slices, maps, and functions; these types cannot be compared using ==, and may not be used as map keys.
// 删除切片中重复的数据
package main
import (
"fmt"
"reflect"
"sort"
)
func main() {
b := []string{"a", "b", "c", "c", "e", "f", "a", "g", "b", "b", "c"}
sort.Strings(b)
fmt.Println(Duplicate(b))
c := []int{1, 1, 2, 4, 6, 7, 8, 4, 3, 2, 5, 6, 6, 8}
sort.Ints(c)
fmt.Println(DeleteDuplicateValue(c))
}
func Duplicate(a interface{}) (ret []interface{}) {
fmt.Printf("a : %+v\n", a)
va := reflect.ValueOf(a)
fmt.Printf("va : %+v\n", va)
for i := 0; i < va.Len(); i++ {
if i > 0 && reflect.DeepEqual(va.Index(i-1).Interface(), va.Index(i).Interface()) {
continue
}
ret = append(ret, va.Index(i).Interface())
}
return ret
}
// 这种方式比较容易理解
func DeleteDuplicateValue(s []int) (ret []int) {
fmt.Printf("s :%+v\n", s)
tmpM := make(map[int]int) // key的类型要和切片中的数据类型一致
for _, v := range s {
tmpM[v] = 1
}
// 先清空s
s = []int{}
for i, _ := range tmpM {
s = append(s, i)
}
return s
}
输出的结果如下:
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。
来源:https://water.blog.csdn.net/article/details/88076662


猜你喜欢
- 前言每个人写脚本时的格式都会有所不同,有的会注明脚本本身的一些信息,有的则开门见山,这在小团队里其实没什么,基本别人做什么你也都知道,但如果
- Windowns操作系统中安装Python,供大家参考,具体内容如下一.下载Python1.python 官网 下载安装包2.选择
- 注:本文是应Alan邀请为《CSS布局实录》写的一个web标准入门指导。书已经上市近一年了,现在摘选出来,给初学者一个参考。希望了解更多实现
- 本文实例讲述了MySQL使用外键实现级联删除与更新的方法。分享给大家供大家参考,具体如下:MySQL支持外键的存储引擎只有InnoDB,在创
- 我第一次接触爬虫这东西是在今年的5月份,当时写了一个博客搜索引擎,所用到的爬虫也挺智能的,起码比电影来了这个站用到的爬虫水平高多了!回到用P
- 本文介绍的是关于Python中列表项的推导式与过滤操作的相关内容,分享出来供大家参考学习,下面来一起看看吧:典型代码1:data_list
- 一.垃圾回收机制Python中的垃圾回收是以引用计数为主,分代收集为辅。引用计数的缺陷是循环引用的问题。在Python中,如果一个对象的引用
- -- 1. 查看被锁的表SELECT p.spid, a.serial#, c.object_name, b.session_id, b.o
- Doug Bowman,Google的Visual Design Lead离职了,一封带有感 * 彩的离职信惹发了大家不少的讨论。甚至还有人用
- 开门见山,直接以例子介绍: 代码如下:CREATE TABLE [dbo].[course]( [id] [int] NULL,
- 一.打包Flask项目1.1自己写个Flask1.2 下载pyinstallerpip install pyinstaller可选参数示例说
- 与Channel区别Channel能够很好的帮助我们控制并发,但是在开发习惯上与显示的表达不太相同,所以在Go语言中可以利用sync包中的W
- 之前我给粉丝们搞过个投票,寻找MySQL中那个最熟悉的陌生人~~MySQL中哪些技术点是你既熟悉又陌生的?前三名和我预料大差不差,分别是
- python版本3.7,用的是虚拟环境安装的pytorch,这样随便折腾,不怕影响其他的python框架1、先定义一个类Linear,继承n
- windows版本下需要先安装ffmpeg工具:1:先下载指定(https://ffmpeg.zeranoe.com/builds/) 有S
- 提高SQL执行效率的几点建议:◆尽量不要在where中包含子查询;关于时间的查询,尽量不要写成:where to_char(dif_date
- 一、oracle oracle服务器有Oracle instace 和Oracle database instance有memory str
- 如果按本文操作遇到一些问题报错,如C:\Users\milyyy\AppData\Roaming\npm-cache\_logs\2018-
- 上一次的错误太多,排版也出现了问题,重写了一遍,希望大家支持.循环遍历一个元素是开发中最常见的需求之一,那么让我们来看一个由框架BASE2和
- Pandas中对 时间 这个属性的处理有非常非常多的操作。而本文对其中一个大家可能比较陌生的方法进行讲解。其他的我会陆续上传。应用情景是这样