为了账号安全,请及时绑定邮箱和手机立即绑定

如何从复杂的地图中删除一个键?

如何从复杂的地图中删除一个键?

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 关注
  • 88 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号