如何找出'map [string] [] [] int'是否具有值

时间:2018-12-05 22:44:59

标签: dictionary go

给出以下代码:

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]'。

2 个答案:

答案 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)

仅按键索引地图。这意味着找到ab便宜又容易(理想的时间复杂度是常数),但是很难找到一个值(线性时间复杂度)。

因此,有一些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
}