Как узнать, имеет ли значение 'map [string] [] [] int' значение - PullRequest
0 голосов
/ 06 декабря 2018

Учитывая этот код:

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 голосов
/ 06 декабря 2018

Карты индексируются только по ключу.Это означает, что его дешево и легко (в идеале постоянная сложность времени) найти a или b, но его сложнее найти значение (линейная сложность времени).

Следовательно, несколько циклов:

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
}
0 голосов
/ 06 декабря 2018

Вам придется перебирать содержимое вашей карты, чтобы проверить, содержится ли элемент в этой карте или нет.

Например:

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 вы получите «Да».

Если ваши самые внутренние кусочки становятся длиннее, вы должны выполнить шаг проверкикак цикл, а не так жестко закодировано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...