从切片中删除字符串切片

我想从切片中删除切片范围,例如从“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"


MM们
浏览 93回答 2
2回答

慕的地10843

最好(更快)使用地图来表示要删除的项目。如果原始列表中有 N 个东西,待删除列表中有 M 个东西,您的代码(一旦错误被修复)将在 O(NM) 时间内运行,而基于地图的解决方案将在准时。这是示例代码:package mainimport "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)次了。

狐的传说

您需要做的是检查原始项目中的每个项目是否存在于要删除的项目列表中,如果不存在,则将其添加到结果中: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”构造?翔实的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go