Как узнать, содержат ли ключи карты определенные строки? - PullRequest
0 голосов
/ 31 января 2020

Предположим, у меня есть фрагмент строк, например:

fruits := {"apple", "orange", "banana"}

и карта типа

box:= map[string]int{
    "chicken": 1,
    "drinks": 4,
    "apples": 42,
}

Какой самый эффективный способ проверить, содержит ли box apple, orange или banana? Обратите внимание, что здесь мы ищем не точное совпадение, а ключ, который СОДЕРЖИТ определенных строк. Так что простой поиск ключа здесь не работает.

Я знаю, что могу извлечь ключи из карты:

keys := make([]string)
for k := range box {
    keys = append(keys, k)
}

И затем выполнить итерацию по обоим слоям для поиска среди ключей:

for _, f := range fruits {
  for _, k in keys {
      if strings.Contains(k, f) {
       fmt.Println("Fruit found!")
       }
   }

Но это опровергает Преимущество использования карты вместо слайса для поиска строк. Так есть ли лучший способ сделать это?

1 Ответ

5 голосов
/ 31 января 2020

Вам не нужно извлекать ключи:

for _, f := range fruits {
  for k,fruit := range box {
      if strings.Contains(k, f) {
       fmt.Printf("Fruit found!: %s",fruit)
       }
   }
}

Если вам нужно только проверить, существует ли ключ, вы можете написать for k := range box

, так как это содержит поиск, нет простого способа сделать это. Если это начинается с поиска , существуют другие структуры данных, на которые вы, возможно, захотите посмотреть, например tr ie или префиксное дерево. Для них не поддерживается стандартная библиотека.

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