第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

檢查一個(gè)地圖是否是另一個(gè)地圖的子集

檢查一個(gè)地圖是否是另一個(gè)地圖的子集

Go
慕工程0101907 2022-09-05 15:34:16
這個(gè)問(wèn)題已經(jīng)以許多其他語(yǔ)言得到回答。在golang中,使用簡(jiǎn)單的地圖(無(wú)嵌套)如何找出一個(gè)地圖是否是另一個(gè)地圖的子集。例如:是 的子集。我想要一個(gè)通用方法。我的代碼:map[string]string{"a": "b", "e": "f"}map[string]string{"a": "b", "c": "d", "e": "f"}package mainimport (    "fmt"    "reflect")func main() {    a := map[string]string{"a": "b", "c": "d", "e": "f"}    b := map[string]string{"a": "b", "e": "f"}    c := IsMapSubset(a, b)    fmt.Println(c)}func IsMapSubset(mapSet interface{}, mapSubset interface{}) bool {    mapSetValue := reflect.ValueOf(mapSet)    mapSubsetValue := reflect.ValueOf(mapSubset)    if mapSetValue.Kind() != reflect.Map || mapSubsetValue.Kind() != reflect.Map {        return false    }    if reflect.TypeOf(mapSetValue) != reflect.TypeOf(mapSubsetValue) {        return false    }    if len(mapSubsetValue.MapKeys()) == 0 {        return true    }    iterMapSubset := mapSubsetValue.MapRange()    for iterMapSubset.Next() {        k := iterMapSubset.Key()        v := iterMapSubset.Value()        if value := mapSetValue.MapIndex(k); value == nil || v != value { // invalid: value == nil            return false        }    }    return true}當(dāng)我想檢查子集映射鍵是否存在于集合映射中時(shí),返回零類(lèi)型的值,并使其無(wú)法與任何內(nèi)容進(jìn)行比較。MapIndex畢竟,我能把同樣的工作做得更好嗎?
查看完整描述

3 回答

?
LEATH

TA貢獻(xiàn)1936條經(jīng)驗(yàn) 獲得超7個(gè)贊

我想要一個(gè)通用方法。


現(xiàn)在Go 1.18和泛型在這里,你可以寫(xiě)這樣一個(gè)泛型函數(shù);見(jiàn)下文和這個(gè)游樂(lè)場(chǎng)。通常不鼓勵(lì)進(jìn)行反射,實(shí)現(xiàn)此功能不需要反射。


package main


import "fmt"


func IsMapSubset[K, V comparable](m, sub map[K]V) bool {

    if len(sub) > len(m) {

        return false

    }

    for k, vsub := range sub {

        if vm, found := m[k]; !found || vm != vsub {

            return false

        }

    }

    return true

}


type MyMap map[string]string


func main() {

    a := map[string]string{"a": "b", "c": "d", "e": "f"}

    b := map[string]string{"a": "b", "e": "f"}

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

    fmt.Println(IsMapSubset(a, b))

    fmt.Println(IsMapSubset(a, c))

    fmt.Println(IsMapSubset(MyMap(a), c))

}

輸出:


true

false

不過(guò),關(guān)于NaN的常見(jiàn)警告適用。


查看完整回答
反對(duì) 回復(fù) 2022-09-05
?
人到中年有點(diǎn)甜

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超7個(gè)贊

Value.MapIndex() 返回一個(gè)反射。值,它是一個(gè)結(jié)構(gòu),不是結(jié)構(gòu)的有效值。不能將結(jié)構(gòu)值與 進(jìn)行比較。nilnil

Value.MapIndex()聲明:

如果在映射中找不到鍵,或者如果 v 表示 nil 映射,則返回零值。

因此,要判斷是否在映射中找不到該鍵,請(qǐng)檢查返回的鍵是否為其零值。為此,您可以使用 Value.IsValid() 方法。reflect.Value

您也不能(不應(yīng)該)比較值。而是使用 Value.Interface() 獲取其包裝值,并對(duì)其進(jìn)行比較。reflect.Value

if v2 := mapSetValue.MapIndex(k); !v2.IsValid() || v.Interface() != v2.Interface() {    return false}

測(cè)試它:

a := map[string]string{"a": "b", "c": "d", "e": "f"}
b := map[string]string{"a": "b", "e": "f"}
fmt.Println(IsMapSubset(a, b))

c := map[string]string{"a": "b", "e": "X"}
fmt.Println(IsMapSubset(a, c))

輸出將是(在Go Playground上嘗試):

truefalse


查看完整回答
反對(duì) 回復(fù) 2022-09-05
?
藍(lán)山帝景

TA貢獻(xiàn)1843條經(jīng)驗(yàn) 獲得超7個(gè)贊

這是工作解決方案,以防有人需要:


// IsMapSubset returns true if mapSubset is a subset of mapSet otherwise false

func IsMapSubset(mapSet interface{}, mapSubset interface{}) bool {


    mapSetValue := reflect.ValueOf(mapSet)

    mapSubsetValue := reflect.ValueOf(mapSubset)


    if fmt.Sprintf("%T", mapSet) != fmt.Sprintf("%T", mapSubset) {

        return false

    }


    if len(mapSetValue.MapKeys()) < len(mapSubsetValue.MapKeys()) {

        return false

    }


    if len(mapSubsetValue.MapKeys()) == 0 {

        return true

    }


    iterMapSubset := mapSubsetValue.MapRange()


    for iterMapSubset.Next() {

        k := iterMapSubset.Key()

        v := iterMapSubset.Value()


        value := mapSetValue.MapIndex(k)


        if !value.IsValid() || v.Interface() != value.Interface() {

            return false

        }

    }


    return true

}


查看完整回答
反對(duì) 回復(fù) 2022-09-05
  • 3 回答
  • 0 關(guān)注
  • 112 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)