Есть отзывы на товар: текст и оценка от 1 до 5. Нужно сгруппировать тексты по
оценке и отдать витрине группы от лучших к худшим.
type Review struct {
Text string
Rating int
}
type Group struct {
Rating int
Texts []string
}
var ErrBadRating = errors.New("rating out of range")
func GroupByRating(reviews []Review) (map[int][]string, error)
func GroupsDesc(reviews []Review) ([]Group, error)
Требования
GroupByRating: оценка → тексты в порядке появления во входе. Оценок, для
которых нет отзывов, в map нет.
- Оценка вне 1..5 → ошибка, для которой
errors.Is(err, ErrBadRating), и
nil-результат. В тексте ошибки — номер плохого отзыва (индекс во входе).
GroupsDesc: те же группы, но срезом, по убыванию оценки, только
непустые. Порядок должен быть стабильным от запуска к запуску.
- Пустой вход → пустой результат без ошибки.
Пример
reviews := []Review{
{"Great!", 5}, {"Good product", 4}, {"Expected more", 3},
{"Disappointed", 1}, {"As described", 5}, {"Did not like it", 1},
}
GroupByRating(reviews)
// map[1:[Disappointed Did not like it] 3:[Expected more] 4:[Good product] 5:[Great! As described]]
GroupsDesc(reviews)
// [{5 [Great! As described]} {4 [Good product]} {3 [Expected more]} {1 [Disappointed Did not like it]}]
Устно: оценок всего пять — нужна ли тут map вообще?
Разбор и эталонное решение — после своей попытки: на собеседовании подсказок не будет.
Сначала попробуй сам — подсказки не дают готовый ответ.