Вам есть о чем беспокоиться.
collectionOrSequence.sortedby{it.value}
запускает java.util.Arrays.sort
, что запустит timSort (или mergeSort по запросу). - timSort отлично, но обычно заканчивается n * log (n) операциями, что намного больше, чем O (n) копирования массива.
- Каждая из операций O (n * log.n) будетзапустите функцию (лямбда, которую вы указали,
{it.value}
) -> дополнительные значимые издержки. - Наконец,
java.util.Arrays.sort
преобразует коллекцию в массив и обратно в список - 2 дополнительных преобразования (которые выхотел бы избежать, но это вторично)
Эффективный способ сделать это, вероятно, это:
map
значения для сравнения в список: O (n) преобразования (один раз на элемент), а не O (n * log.n) или более. - Перебор списка (или массива), созданного для сбора наименьших элементов N за один проход
- Сохраните список из N наименьших найденных элементов и их указатель в исходном списке.Если оно маленькое (например, 10 элементов) -
mutableList
хорошо подходит. - Сохраняйте переменную, содержащую максимальное значение для списка малых элементов.
- При переборе исходной коллекции,сравните текущий элемент в исходном списке с максимальным значением списка малых значений.Если меньше его - замените его в «маленьком списке» и найдите в нем обновленное максимальное значение.
- Используйте индексы из «маленького списка», чтобы извлечь 10 самых маленьких элементовисходный список.
Это позволит вам перейти от O (n * log.n) к O (n).
Конечно, если время критично - этовсегда лучше всего тестировать конкретный случай.
Если на первом этапе вам удалось извлечь примитивы для сравнения (например, int
или long
) - это было бы еще эффективнее.