亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

無序檢查切片的相等性

無序檢查切片的相等性

Go
冉冉說 2021-12-20 19:16:06
我正在嘗試找到一種解決方案來檢查 2 個切片中的相等性。不幸的是,我找到的答案要求切片中的值具有相同的順序。例如,http: //play.golang.org/p/yV0q1_u3xR 將相等性評估為假。我想要一個可以[]string{"a","b","c"} == []string{"b","a","c"}評估為true.更多示例[]string{"a","a","c"} == []string{"c","a","c"}>>> false[]string{"z","z","x"} == []string{"x","z","z"}>>>true
查看完整描述

3 回答

?
一只甜甜圈

TA貢獻1836條經驗 獲得超5個贊

這是一個替代解決方案,雖然可能有點冗長:


func sameStringSlice(x, y []string) bool {

    if len(x) != len(y) {

        return false

    }

    // create a map of string -> int

    diff := make(map[string]int, len(x))

    for _, _x := range x {

        // 0 value for int is 0, so just increment a counter for the string

        diff[_x]++

    }

    for _, _y := range y {

        // If the string _y is not in diff bail out early

        if _, ok := diff[_y]; !ok {

            return false

        }

        diff[_y] -= 1

        if diff[_y] == 0 {

            delete(diff, _y)

        }

    }

    return len(diff) == 0

}

試試吧 Go Playground


查看完整回答
反對 回復 2021-12-20
?
吃雞游戲

TA貢獻1829條經驗 獲得超7個贊

其他答案有更好的時間復雜度O(N)VS (O(N log(N)),這是我的答案,也是我的解決方案將占用更多的內存,如果在片元素被頻繁地重復,但我想補充它,因為我覺得這是應該做的最直接的方式它:


package main


import (

    "fmt"

    "sort"

    "reflect"

)


func array_sorted_equal(a, b []string) bool {

    if len(a) != len(b) {return false }


    a_copy := make([]string, len(a))

    b_copy := make([]string, len(b))


    copy(a_copy, a)

    copy(b_copy, b)


    sort.Strings(a_copy)

    sort.Strings(b_copy)


    return reflect.DeepEqual(a_copy, b_copy)

}


func main() {

    a := []string {"a", "a", "c"}

    b := []string {"c", "a", "c"}

    c := []string {"z","z","x"} 

    d := []string {"x","z","z"}



    fmt.Println( array_sorted_equal(a, b))

    fmt.Println( array_sorted_equal(c, d))


}

結果:


false

true


查看完整回答
反對 回復 2021-12-20
?
哈士奇WWW

TA貢獻1799條經驗 獲得超6個贊

我認為最簡單的方法是將每個數組/切片中的元素映射到它們的出現次數,然后比較映射:


func main() {

    x := []string{"a","b","c"}

    y := []string{"c","b","a"}


    xMap := make(map[string]int)

    yMap := make(map[string]int)


    for _, xElem := range x {

        xMap[xElem]++

    }

    for _, yElem := range y {

        yMap[yElem]++

    }


    for xMapKey, xMapVal := range xMap {

        if yMap[xMapKey] != xMapVal {

            return false

        }

    }

    return true

}

如果您的數組/切片包含不同類型或不同長度的元素,您將需要添加一些額外的盡職調查,例如短路。


查看完整回答
反對 回復 2021-12-20
  • 3 回答
  • 0 關注
  • 211 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號