从切片图中删除重复项

问题描述 投票:1回答:1

我有一个切片地图,我需要从中删除重复的切片。我认为我已经接近解决方案,但是我缺少一些我无法弄清楚的东西。

预期输出:map[key1:[1 2 3] key2:[1 2 3]]

实际输出:map[key2:[1 2 3]]

    package main

    import "fmt"

    func main() {
        x := make(map[string][]string)
        keys := make(map[string]bool)
        result := make(map[string][]string)

        x["key1"] = append(x["key1"], "1")
        x["key1"] = append(x["key1"], "1")
        x["key1"] = append(x["key1"], "2")
        x["key1"] = append(x["key1"], "3")
        x["key1"] = append(x["key1"], "3")
        x["key2"] = append(x["key2"], "1")
        x["key2"] = append(x["key2"], "2")
        x["key2"] = append(x["key2"], "2")
        x["key2"] = append(x["key2"], "3")

        fmt.Println(x)

        for k, e := range x{
            for _, v := range e {
                if _, val := keys[v]; !val {
                    keys[v] = true
                    result[k] = append(result[k], v)
                }
            }
        }
        fmt.Println(result)
    }

[这里是操场上的例子:Go Playground

dictionary go slice
1个回答
1
投票

您希望对所有切片进行不同的处理。例如。您要从x["key1"]表示的切片中删除重复项,并且要从x["key2"]表示的切片中删除重复项。这意味着在处理新片时应“重置” keys,但只初始化一次。

因此,如果(有可能)首先处理x["key1"],然后继续进行x["key2"],由于x["key1"]包含x["key2"]的所有元素,因此不会找到新元素,因此"key2"将被完全排除在结果之外。

在循环内,在每个切片之前简单地初始化keys

for k, e := range x {
    keys := make(map[string]bool)
    for _, v := range e {
        if _, val := keys[v]; !val {
            keys[v] = true
            result[k] = append(result[k], v)
        }
    }
}

这样,输出将是(在Go Playground上尝试):

map[key1:[1 1 2 3 3] key2:[1 2 2 3]]
map[key1:[1 2 3] key2:[1 2 3]]

还请注意,您可以使用composite literal这样紧凑的方式创建初始地图:

x := map[string][]string{
    "key1": {"1", "1", "2", "3", "3"},
    "key2": {"1", "2", "2", "3"},
}

并且由于您在bool映射中使用了keys,因此您可以简单地检查是否存在这样的现有元素(因为使用不在其中的键索引该映射会导致该映射的值类型的值为零,对于boolfalse,可以正确判断元素不在地图中):

if !keys[v] {
    keys[v] = true
    result[k] = append(result[k], v)
}

Go Playground上尝试此。

您可以在此处了解更多信息:How to check if a map contains a key in Go?;和How can I create an array that contains unique strings?

© www.soinside.com 2019 - 2024. All rights reserved.