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

从切片中删除字符串切片

从切片中删除字符串切片

Go
MM们 2022-11-23 20:28:55

我想从切片中删除切片范围,例如从“A”到“Z”中删除“A”、“B”,但我想让它更有效率(我不知道为什么在 Go 中,但在 Python 中我们可以使用 hashmap ).


下面的代码是我能得到的最接近的代码,但我错过了一些边缘情况:


func removeString(listOri []string, targetDelete []string) []string {

    newitems := []string{}

    for i := range listOri {

        for j := range targetDelete {

            if listOri [i] != targetDelete[j] {

                newitems = append(newitems, listOri [i])

            }

        }

    }


    return newitems

}


listOriginal := []string{"A", "B", "C", "D"}

listDelete := []string{"A", "B"}

listNew := removeString(listOriginal, listDelete)

result = "A","B","C","C","D","D"


查看完整描述

2 回答

?
慕的地10843

TA贡献1542条经验 获得超8个赞

最好(更快)使用地图来表示要删除的项目。如果原始列表中有 N 个东西,待删除列表中有 M 个东西,您的代码(一旦错误被修复)将在 O(NM) 时间内运行,而基于地图的解决方案将在准时。


这是示例代码:


package main


import "fmt"


func filter(src []string, del map[string]bool) []string {

    var dst []string

    for _, s := range src {

        if !del[s] {

            dst = append(dst, s)

        }

    }

    return dst

}


func main() {

    src := []string{"A", "B", "C", "D"}

    del := map[string]bool{"A": true, "B": true}

    fmt.Println(filter(src, del))

}

如果确实需要将待删除的东西做成slice,那么应该先将slice转为map。那么代码就是O(N+M)次了。


查看完整回答
反对 回复 2022-11-23
?
狐的传说

TA贡献1519条经验 获得超3个赞

您需要做的是检查原始项目中的每个项目是否存在于要删除的项目列表中,如果不存在,则将其添加到结果中:


func removeString(listOri []string, targetDelete []string) []string {

    newitems := []string{}

    var found bool


    for i := range listOri {

        found = false

        for j := range targetDelete {

            if listOri[i] == targetDelete[j] {

                found = true

                break

            }

        }

        if !found {

            newitems = append(newitems, listOri[i])

        }

    }


    return newitems

}

您可能还会发现Go 是否具有类似于 Python 的“if x in”构造?翔实的。


查看完整回答
反对 回复 2022-11-23

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信