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

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

如何從復雜的地圖中刪除一個鍵?

如何從復雜的地圖中刪除一個鍵?

Go
呼啦一陣風 2022-10-17 19:36:56
我知道這個功能delete(...)。但我有一組地圖:[  {key: "aa", value1: 1, value2: "33"},  {key: "bb", value1: 23, value2: "333"},  {key: "cc", value1: 33, value2: "3366"},  {key: "yy", value1: 99, value2: "666"},  // other items]我將如何從這個結構中刪除具有某些key-s 的項目?比方說,key == "bb"和key == "yy"請注意,此數組的實際大小更大 - 數十或數百個項目。因此,我更喜歡高性能的解決方案。
查看完整描述

1 回答

?
呼如林

TA貢獻1798條經驗 獲得超3個贊

您可以使用標準技巧在迭代時將切片中的內容向下移動,然后在最后截斷。


j := 0

for _, v := range mySlice {

    if v.key != "bb" && v.key != "yy" {

        mySlice[j] = v

        j++

    }

}

mySlice = mySlice[:j]

這使用 O(1) 額外內存,并且效率很高。


在 go1.18 中,您將能夠編寫一個通用函數(通常稱為過濾器)來進行切片。這是一個完整的示例,您也可以在 gotip 操場上運行。


package main


import "fmt"


// filter returns a slice (reusing the backing array of m), that

// contains all the elements of m for which f returns true.

func filter[T any](m []T, f func(*T) bool) []T {

    j := 0

    for i := range m {

        if f(&m[i]) {

            m[j] = m[i]

            j++

        }

    }

    return m[:j]

}


type data struct {

    key    string

    value1 int

    value2 string

}


func main() {

    xs := []data{

        {key: "aa", value1: 1, value2: "33"},

        {key: "bb", value1: 23, value2: "333"},

        {key: "cc", value1: 33, value2: "3366"},

        {key: "yy", value1: 99, value2: "666"},

    }

    xs = filter(xs, func(x *data) bool { return x.key != "bb" && x.key != "yy" })

    fmt.Println(xs)

}


查看完整回答
反對 回復 2022-10-17
  • 1 回答
  • 0 關注
  • 104 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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