2016-04-13 2 views
0

Предположим, у меня есть map[string]int, и я хочу ключ с кратчайшей длиной (в байтах). Если я не знаю ни одного конкретного элемента, что карта содержит, как я могу получить образец его, так что я могу сделатьКак получить любой элемент карты в Go?

var shortest string 
for key, _ := range myMap { 
    if len(key) < len(shortest) { 
     shortest = key 
    } 
} 
+0

Возможно, я не понимаю вопроса; почему бы вам не попробовать образец кода, который вы предоставили? –

+0

@ william.taylor.09 Это самое короткое. – EMBLEM

ответ

2

Вы можете использовать for цикл и вырваться из него сразу же пробовать только один элемент ,

var shortest string 
for key, _ := range myMap { 
    shortest = key 
    break 
} 
for key, _ := range myMap { 
    if len(key) < len(shortest) { 
     shortest = key 
    } 
} 

Уродливый, но он работает.

+0

Почему это вниз? Зачем? Это полезный небольшой трюк, который я нашел более эффективным, чем другой ответ. – EMBLEM

+0

Извините, EMBLEM. Я проиграл, так как ОП запросил укороченный, и вы предоставили самый длинный. Затем ОП прокомментировал, что хочет короткозамкнутый, и я дал ответ на короткий срок. В то же время вы отредактировали свой ответ, чтобы отразить shorted. Тем не менее, это не позволит мне изменить свой голос, если вы не отредактируете вопрос. Я бы с радостью поддержал вас, если вы предоставите быстрое редактирование ответа, так что С. О. перестанет жаловаться. –

+0

@ william.taylor.09 Я ОП. Я ответил на свой вопрос. – EMBLEM

0

Вы можете выполнить итерацию по карте, добавив элементы в срез. Затем сортировать срез:

var keys []string 
for k := range myMap { 
    keys = append(keys, k) 
} 
sort.Strings(keys) // keys[0] is the shorted 

Goplay: http://play.golang.org/p/DULIiQAkfg

1

Вы должны сначала определить две переменные shortestLength и shortest, они будут записывать наименьшую длину вы нашли до сих пор, и соответствующий ключ, соответственно. А затем начните повторять по карте.

Здесь трюк состоит в том, чтобы инициализировать переменную shortestLength со значением, которое будет переписано в первый проход. Преимущество в том, что вам не нужно писать дополнительный код и выделять дополнительную память для сортировки ключей и поиска самого короткого.

Полный код выглядит следующим образом:

if len(myMap) == 0 { 
    // Empty map 
} 

// Will be over-written in first iteration 
shortestLength := maths.MaxInt32 
shortest := "" 

for key, _ := range myMap { 
    keyLength := len(key) 
    if keyLength <= shortestLength { 
    shortest = key 
    shortestLength = keyLength 
    } 
} 

Переменная shortestLength будет чрезмерно написано с длиной первого элемента в первой итерации нашего цикла. И в конце цикла будет содержать длину кратчайшего ключа. И shortest будет содержать сам ключ.

Смежные вопросы