golang 字符串切片去重

实现目的:实现字符串切片去重,只是两个字符完全相同时,去除一个。

实现方式:考虑两种,一种是常规的双重循环去除,另一种是利用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主键唯一方法。具体需要数据验证。

参考链接:https://blog.csdn.net/qq_27068845/article/details/77407358

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值