Получение части элементов

Последнее обновление: 04.03.2024

slice

Функция slice() возвращает часть коллекции, элементы которой располагаются на определенных индексах. Индексы передаеются в функцию либо в виде диапазона IntRange, либо коллекции значений Iterable<Int>. Результатом функции является список List<T>, который содержит элементы по указанным индексам:

val people = listOf("Tom", "Bob", "Sam", "Kate", "Alice", "Mike")

println(people.slice(1..3))     // [Bob, Sam, Kate]
println(people.slice(0..5 step 2))  // [Tom, Sam, Alice]
println(people.slice(listOf(1, 3, 5, 1)))   // [Bob, Kate, Mike, Bob]

Стоит отметить, что для последовательностей эта функция не доступна.

Take и takeWhile

Функция take() извлекает из начала коллекции/последовательности определенное количество элементов

take(n: Int): List<T>/Sequence<T>

Например, выберем 3 первых элементов:

val people = listOf("Tom", "Bob", "Sam", "Kate", "Alice", "Mike")
println(people.take(3))     // ["Tom", "Bob", "Sam"]

Для коллекций также доступна функция takeLast(), которая извлекает определенное количество элементов из конца коллекции

val people = listOf("Tom", "Bob", "Sam", "Kate", "Alice", "Mike")
// получаем три последних элемента
println(people.takeLast(3))     // ["Kate", "Alice", "Mike"]

Функция takeWhile() отбирает элементы с начала коллекции/последовательности, которые соответвуют условию предиката:

takeWhile(predicate: (T) -> Boolean): List<T>       // для коллекций
takeWhile(predicate: (T) -> Boolean): Sequence<T>   // для последовательностей

функция предиката получает в качестве параметра текущий элемент и возращает true, если элемент соответствует условию:

val people = listOf("Tom", "Sam", "Kate", "Bob", "Alice", "Mike")
val part = people.takeWhile{it.length == 3}
println(part)     // ["Tom", "Sam"]

В данном случае условие предиката возвращает true, если длина строки равна 3: {it.length == 3}, поэтому функция takeWhile отбирает строки, пока они соответствуют этому условию. Так, в данном случае в результирующем списке окажется первые два элемента: ["Tom", "Sam"]. Когда функция takeWhile() встретит хоть один элемент, который не соответствует условию, она завершит работу. Хотя в списке people есть еще элементы с длиной в три символа (элемент "Bob"). Поэтому если в списке первый элемент уже не соответствует условию предиката, то функция возвратит пустой список:

val people = listOf("Tom", "Sam", "Kate", "Bob", "Alice", "Mike")
val part = people.takeWhile{it.length == 4}     // выбираем строки с длиной в 4 символа
println(part)     // [] - пустой список

Для коллекций также доступа функция takeLastWhile(), которая работает аналогичным образом, только выбирает элементы с конца списка

val people = listOf("Tom", "Sam", "Kate", "Bob", "Alice", "Mike")
val part = people.takeLastWhile{it.length !=3} // длина НЕ равна 3
println(part)     // ["Alice", "Mike"]

drop и dropWhile

Функция drop() позволяет пропустить определенное количество элементов в коллекции/последовательности:

val people = listOf("Tom", "Sam", "Kate", "Bob", "Alice", "Mike")
val part = people.drop(3) // пропускаем первые 3 элемента
println(part)     // [Bob, Alice, Mike]

Для коллекций также доступна функция dropLast(), которая проупскает определенное количество элементов из конца коллекции

val people = listOf("Tom", "Sam", "Kate", "Bob", "Alice", "Mike")
val part = people.dropLast(2) // пропускаем последние 2 элемента
println(part)     // [Tom, Sam, Kate, Bob]

Функция dropWhile() пропускает элементы с начала коллекции/последовательности, которые соответвуют условию предиката:

dropWhile(predicate: (T) -> Boolean): List<T>       // для коллекций
dropWhile(predicate: (T) -> Boolean): Sequence<T>   // для последовательностей

функция предиката получает в качестве параметра текущий элемент и возращает true, если элемент соответствует условию:

val people = listOf("Tom", "Sam", "Kate", "Bob", "Alice", "Mike")
val part = people.dropWhile{it.length == 3}
println(part)     // [Kate, Bob, Alice, Mike]

В данном случае условие предиката возвращает true, если длина строки равна 3: {it.length == 3}, поэтому функция dropWhile() пропускает строки, пока они соответствуют этому условию. Так, в данном случае в результирующем списке окажется первые два элемента: [Kate, Bob, Alice, Mike]. Когда функция dropWhile() встретит хоть один элемент, который не соответствует условию, она завершит работу. Хотя в списке people есть еще элементы с длиной в три символа (элемент "Bob"). Поэтому если в списке первый элемент уже не соответствует условию предиката, то функция возвратит список со всеми элементами.

Для коллекций также доступа функция dropLastWhile(), которая работает аналогичным образом, только пропускает элементы с конца списка

val people = listOf("Tom", "Sam", "Kate", "Bob", "Alice", "Mike")
val part = people.dropLastWhile{it.length !=3} // длина НЕ равна 3
println(part)     // ["Tom", "Sam", "Kate", "Bob"]

Разделение на части

Функция chuncked() позволяет разбить коллекцию/последовательность на списки определенной длины:

chunked(size: Int): List<List<T>>       // для коллекций
chunked(size: Int): Sequence<List<T>>  // для последовательностей

В качестве параметра в функцию передается размер списков, в которые будут помещаться элементы:

val people = listOf("Tom", "Sam", "Kate", "Bob", "Alice", "Mike")
val parts = people.chunked(3)
println(parts)     // [[Tom, Sam, Kate], [Bob, Alice, Mike]]

В данном случае разбиваем коллекцию на списки по 3 элемента, соответственно результирующая коллекция будет содержать два списка по три элемента.

Дополнительная версия функции в качестве второго параметра принимает функцию преобразования элементов:

chunked(size: Int, transform: (List<T>) -> R): List<R>      // для коллекций
chunked(size: Int,transform: (List<T>) -> R): Sequence<R> // для последовательностей

То есть сначала коллекция/последовательность разбивается на несколько списков длиной size, затем каждый список передается в функцию преобразования, где на его основе можно сгенерировать новое значение. Например:

val people = listOf("Tom", "Sam", "Kate", "Bob", "Alice", "Mike")
val parts = people.chunked(3){it.first()}
println(parts)     // [Tom, Bob]

В данном случае коллекция разделяется на два списка длиной по 3 элемента. В функции преобразования из каждого списка выбирается и возвращается первый элемент каждого списка. Соответственно результатом функции будет список из двух первых элементов.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850