Хотя ваше решение вполне читабельно, оно копирует все элементы оригинального List<Int>
на каждой итерации for
-loop, так как +=
на var newList: List<Int>
будет каждый раз создавать новый список.Вычислительная сложность наихудшего случая - O (n²), которую можно улучшить до O (n).
Для этого конкретного случая, когда вы просто хотите добавить непрерывный диапазон в список,Однострочная функция, подобная этой, будет работать:
fun List<Int>.padWithIndices(newLength: Int): List<Int> =
plus(size until newLength)
(исполняемый образец)
Вызывает plus
функция в списке получателей, создающая новый список с добавленными элементами из аргумента.
Вы также можете вызвать plus
как оператор +
, заменив строку наthis + (size until newLength)
.
Для случаев использования с более сложной логикой для вычисления элементов, которые вы добавляете в список, вы можете использовать List(n) { ... }
фабричная функция , которая принимаетЛямбда обеспечивает элементы списка и таким образом гарантирует, что каждый элемент списка вычисляется только один раз:
fun List<Int>.padWithIndices(newLength: Int): List<Int> =
List(newLength) { index -> getOrNull(index) ?: index }
(исполняемый образец)
ФункцияgetOrNull(index)
возвращает элемент по указанному индексу или null
, если индекс выходит за пределы.Последний обрабатывается ?: index
.
В качестве альтернативы, переписать ваше решение и использовать изменяемый список внутри реализации функции, добавляя элементы к нему, а затем возвращать его только для чтения List<Int>
:
fun List<Int>.padWithIndices(newLength: Int): List<Int> =
toMutableList().apply {
addAll(size until newLength)
}
(готовый образец)