给出以下代码:
var a map[string][][]int
var aa map[string][][]int = map[string][][]int{"a": [][]int{{10, 10}, {20, 20}}}
var bb map[string][][]int = map[string][][]int{"b": [][]int{{30, 30}, {40, 40}}}
fmt.Println(aa) // >> map[a:[[10 10] [20 20]] b:[[30 30] [40 40]]]
我怎么知道'[30,30]'是否在'aa'中?
我要检查'aa'是否具有'[30 30]'。
答案 0 :(得分:0)
您必须遍历地图的内容,以检查该地图中是否包含元素。
例如:
target := []int{30, 30}
for _, v := range myMap {
for _, sub := range v {
if len(sub) == len(target) && sub[0] == target[0] && sub[1] == target[1] {
fmt.Println("yeah")
}
}
}
将myMap
设置为aa
,将不会得到任何输出;将myMap
设置为bb
,您将得到“是”的打印结果。
如果最里面的切片变长,则也应将检查步骤作为循环执行,而不是像这样硬编码。
答案 1 :(得分:0)
仅按键索引地图。这意味着找到a
或b
便宜又容易(理想的时间复杂度是常数),但是很难找到一个值(线性时间复杂度)。
因此,有一些for循环:
func find(searchFor [][]int, m map[string][][]int) bool {
for _, v := range m {
if sliceEq(v, searchFor) {
return true
}
}
return false
}
func sliceEq(a, b [][]int) bool {
if len(a) != len(b) {
return false
}
for i := range a {
if a[i] != b[i] {
return false
}
}
return true
}