Как оптимизировать подсчет одинаковых элементов в массиве

Есть пример вот такого кода. Но проблема в том что он вывод первое чаще повторяющеся слово, а нужно сделать похожим способом первых 10 слов

func MostPopularWord(words []string) string {
wordsCount := make(map[string]int, 0)
    mostPopWord := ""
    max := 0
    for _, word := range words {
        wordsCount[word]++
        if wordsCount[word] > max {
            max = wordsCount[word]
            mostPopWord = word
        }
    }

    return mostPopWord
}

Ответы (1 шт):

Автор решения: Viktor Solovev

Если вопрос звучит про оптимизацию, то:

wordsCount := make(map[string]int, len(words))

это приведет к аллокации памяти для wordsCount в размере слайса входных слов и не будет в процессе выполнения функции дополнительных переаллокаций.

Если вопрос про выборку 10 самых популярных слов, то тут совсем не то. Предлагается сделать структуру типа

type popularWord {
     Word string
     Count int
}

Пройтись по слайсу, подсчистать через map[string]int, пройтись по map, разложить с слайс структур, дополнительно сделать реализацию типа:

sort.Slice(slicePopularWord, func(i, j int) bool {
    return slicePopularWord[i].Count > slicePopularWord[j].Count
})

И в конце return slicePopularWord[:10] - 10 самых популярных слов.

Все проверки условий оставлю на Вас.

→ Ссылка