检查地图在Go中是否有重复值
考虑下面的地图检查地图在Go中是否有重复值,go,Go,考虑下面的地图 mymap := make(map[string]string) mymap["a"] = "one" mymap["b"] = "two" mymap["c"] = "one" 如何确定这些值是否唯一 一种策略是遍历映射,创建一个值片段。然后遍历切片以查找重复项。有更好的方法吗?如果您只需要判断是否存在重复项,而不需要知道哪些值是重复项或有多少重复项,那么跟踪现有值的最有效结构是带有空结构值的映射 请参阅(为方便起见粘贴在下面): 表示存在重复值的false为true。我习惯
mymap := make(map[string]string)
mymap["a"] = "one"
mymap["b"] = "two"
mymap["c"] = "one"
如何确定这些值是否唯一
一种策略是遍历映射,创建一个值片段。然后遍历切片以查找重复项。有更好的方法吗?如果您只需要判断是否存在重复项,而不需要知道哪些值是重复项或有多少重复项,那么跟踪现有值的最有效结构是带有空结构值的映射 请参阅(为方便起见粘贴在下面):
表示存在重复值的false为true。我习惯于在python中使用set,然后检查长度。但golang不支持集合。您可以将地图用作集合
map[string]struct{}
将是最有效的string
set类型,因为空结构值将不占用内存。请解释struct{}{}的含义。这是匿名空结构类型的文本。要解决这个问题,您可能熟悉类似于typemystruct struct{myfieldstring};x:=myStruct{myField:“foo”}
。空结构是一种没有字段的结构类型,因此您也可以想象类似于type emptyStruct struct{};x:=emptyStruct{}
。我不需要创建一个显式命名的emptyStruct
struct,我可以内联类型,在这种情况下它将是匿名的(即它没有名称),比如:x:=struct{}
。您也可以使用非空结构执行此操作,例如x:=struct{myField string}{myField:“foo”}
。
package main
import (
"fmt"
)
func hasDupes(m map[string]string) bool {
x := make(map[string]struct{})
for _, v := range m {
if _, has := x[v]; has {
return true
}
x[v] = struct{}{}
}
return false
}
func main() {
mapWithDupes := make(map[string]string)
mapWithDupes["a"] = "one"
mapWithDupes["b"] = "two"
mapWithDupes["c"] = "one"
fmt.Println(hasDupes(mapWithDupes)) // prints true
mapWithoutDupes := make(map[string]string)
mapWithoutDupes["a"] = "one"
mapWithoutDupes["b"] = "two"
mapWithoutDupes["c"] = "three"
fmt.Println(hasDupes(mapWithoutDupes)) // prints false
}