К примеру, при вводе строки "Привет мир, hello world, hello мир, привет world" на выходе должен получится такой список список :
привет - 2;
мир - 2;
hello - 2;
world -2;
Как написать такую функцию?
package main
import (
"fmt"
"regexp"
"strings"
)
//Создаём структуру для хранения кол-ва слов и самих слов
type Words struct {
i int // кол-во слов
s string // тут само слово
}
func main() {
str := "Привет мир, hello world, hello мир, привет world, , "
// приводим всё в нижний регистр для устранения проблем с различием слов 'Привет' и 'привет'
str = strings.ToLower(str)
// Разбиваем строку на массив строк по регулярному выражению, ищем либо ',' либо ' ' (пробел)
arr := regexp.MustCompile("[,| ]+").Split(str, -1)
//создаём массив структур для хранения результатов
ret := []Words{}
chk := false
// проходим циклом для сранения есть ли такое слово в массиве ret или нет
k := 0
for i := 0; i < len(arr); i++ {
chk = false
for k = 0; k < len(ret); k++ {
if arr[i] == ret[k].s {
// если слово уже есть увеличивем счётчик и слово пропускаем
ret[k].i += 1
chk = true
}
}
// если chk true то слово уже есть и ничего делать ненадо
if !chk {
// проверяем что в строке есть буквы и если они есть добавляем её в массив с результатами
if regexp.MustCompile("[a-zа-яё]+").MatchString(arr[i]) {
tmp := Words{i: 1, s: arr[i]}
ret = append(ret, tmp)
}
}
}
// выводим результат
for l := 0; l < len(ret); l++ {
fmt.Printf("%v - %v\n", (ret[l].s), (ret[l].i))
}
}
P.S.: проверка
if regexp.MustCompile("[a-zа-яё]+").MatchString(arr[i])
нужна для того чтобы в результаты не пролез мусор в виде пробелов если пользователь введёт что-то типа:"Привет мир, hello world, hello мир, привет world, , "
хотя это можно сделать и красивее.
@golang_interview