溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

利益golang怎么對字符串切片去重

發布時間:2020-12-22 16:12:48 來源:億速云 閱讀:149 作者:Leah 欄目:開發技術

利益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主鍵唯一方法。具體需要數據驗證。

補充: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
}

輸出的結果如下:

利益golang怎么對字符串切片去重

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女