中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

怎么在golang中對slice元素去重

發布時間:2021-05-03 12:15:26 來源:億速云 閱讀:422 作者:Leah 欄目:開發技術

怎么在golang中對slice元素去重?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

什么是golang

golang 是Google開發的一種靜態強類型、編譯型、并發型,并具有垃圾回收功能的編程語言,其語法與 C語言相近,但并不包括如枚舉、異常處理、繼承、泛型、斷言、虛函數等功能。

1. 通過雙重循環來過濾重復元素(時間換空間)

// 通過兩重循環過濾重復元素
func RemoveRepByLoop(slc []int) []int {
    result := []int{}  // 存放結果
    for i := range slc{
        flag := true
        for j := range result{
            if slc[i] == result[j] {
                flag = false  // 存在重復元素,標識為false
                break
            }
        }
        if flag {  // 標識為false,不添加進結果
            result = append(result, slc[i])
        }
    }
    return result
}

2. 通過字典來過濾(空間換時間)

因為字典的主鍵唯一,所以可以用來判斷元素是否重復

// 通過map主鍵唯一的特性過濾重復元素
func RemoveRepByMap(slc []int) []int {
    result := []int{}
    tempMap := map[int]byte{}  // 存放不重復主鍵
    for _, e := range slc{
        l := len(tempMap)
        tempMap[e] = 0
        if len(tempMap) != l{  // 加入map后,map長度變化,則元素不重復
            result = append(result, e)
        }
    }
    return result
}

ps : 這里為了節省內存,使用map[int]byte。 因為map的value并沒有用到,所以什么類型都可以。

效率第一,如果節省計算時間,則可以采用如下方式

// 元素去重
func RemoveRep(slc []int) []int{
    if len(slc) < 1024 {
        // 切片長度小于1024的時候,循環來過濾
        return RemoveRepByLoop(slc)
    }else{
        // 大于的時候,通過map來過濾
        return RemoveRepByMap(slc)
    }
}

ps:1024 這個數字不是特別精準,我是使用go test 的基準測試,手工的比較的。

大約在這個數量超上,使用map方式的速度要快,小于這個數量級后,loop方式要快,而且省內存。

補充:Golang數組去重&切片去重

方法一:

定義一個新切片(數組),存放原數組的第一個元素,然后將新切片(數組)與原切片(數組)的元素一一對比,如果不同則存放在新切片(數組)中。

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
}

方法二:

先將原切片(數組)進行排序,在將相鄰的元素進行比較,如果不同則存放在新切片(數組)中。

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)
    sort.Strings(arr)
    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
}

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

向AI問一下細節

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

AI

江源县| 永顺县| 丹江口市| 沙湾县| 健康| 水城县| 方城县| 灌阳县| 信丰县| 诸城市| 青海省| 井研县| 新巴尔虎左旗| 建德市| 瓮安县| 浑源县| 柘荣县| 岳阳市| 湛江市| 屯昌县| 尖扎县| 黑水县| 贵港市| 上林县| 同江市| 巴林右旗| 三河市| 开鲁县| 时尚| 贺州市| 金坛市| 和静县| 淅川县| 洛川县| 柘城县| 宁陕县| 即墨市| 青海省| 乾安县| 江永县| 察雅县|