我有一张切片地图,我需要从中删除重复的切片。我认为我已经接近解决方案,但是我缺少一些我无法弄清楚的东西。
预期输出: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
答案 0 :(得分: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
,因此您可以简单地检查现有的元素(因为使用不在其中的键索引映射会导致该键的值为零)地图的值类型(对于bool
为false
,可以正确告知元素不在地图中):
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?