Выбор ответа Middle Задачи на Kotlin обновлено

Сортировка по двум ключам

Вопрос

Как отсортировать список пар (score, name) по убыванию очков, а при равенстве по имени?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: sortedWith(compareByDescending<Pair<Int, String { it.first }.thenBy { it.second }). Составной компаратор описывает оба ключа явно.

Варианты ответа

  1. sortedBy { it.first }.sortedBy { it.second }: две устойчивые сортировки
  2. sortedDescending(): Pair сравнивается по first, затем по second
  3. sortedByDescending { it.first + it.second } с ключом из обоих полей
  4. sortedWith(compareByDescending<Pair<Int, String>> { it.first }.thenBy { it.second })правильный ответ

Разбор

Составной компаратор описывает оба ключа явно. Две сортировки подряд тоже возможны, но в обратном порядке ключей: сначала по имени, потом устойчиво по очкам. Если сортировать сначала по очкам, а потом по имени, вторая сортировка перемешает результат первой. sortedDescending() для Pair не скомпилируется: Pair не Comparable. Сложение числа со строкой не даёт осмысленного ключа.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.