Последняя версия без перестановки
Объединить дубликаты, сохранив порядок первого появления
Приходит список Note(id, text). Верни по одной заметке на ID: содержимое берётся из последнего вхождения, порядок — по первому появлению ID. Входной список не меняй.
Проверки для ручного сравнения:
[1:a, 2:b, 1:c]→[1:c, 2:b].[2:a, 1:b, 2:c, 3:d]→[2:c, 1:b, 3:d].- Пустой вход → пустой результат; разные ID с одинаковым text остаются разными записями.
Ожидается один проход и O(k) дополнительной памяти для k разных ID. Оценка O(n) по времени предполагает обычную среднюю стоимость hash-операций. Не сортируй результат по ID.
Адаптировано из задач на удаление дубликатов в draft/lifeconding.md; требование последней версии добавлено для проверки понимания порядка.
Сохранённый код превышает предел редактора. Скачай его перед сбросом; исходная запись сохранена.
Запись по существующему ключу заменяет значение, сохраняя позицию ключа в LinkedHashMap. Поэтому отдельно запоминать порядок не требуется. distinctBy оставил бы первую версию, сортировка изменила бы требуемый порядок.
Возвращается новый список неизменяемых в данном примере Note; вход не модифицируется. Для моделей с изменяемыми вложенными полями понадобился бы отдельный договор копирования. Kotlin: коллекции, LinkedHashMap.
Решение предназначено для ручного сравнения; сайт Kotlin-код не выполняет.