Операции записи коллекций
Изменяемые коллекции поддерживают операции, изменяющие её содержимое, например, операции по добавлению и удалению элементов. В этом разделе описаны операции записи, доступные для всех реализаций MutableCollection
. Более конкретные операции, доступные для List
и Map
, описаны в разделах List: специфичные операции и Map: специфичные операции.
Добавление элементов
Чтобы добавить один элемент в список или множество (Set
), используйте функцию
add()
. Указанный объект будет добавлен в конец коллекции.
fun main() {
val numbers = mutableListOf(1, 2, 3, 4)
numbers.add(5)
println(numbers) // [1, 2, 3, 4, 5]
}
Функция addAll()
добавляет все элементы из переданного в качестве аргумента объекта в список или множество. Аргументом может быть Iterable
, Sequence
, или Array
. Типы объекта-получателя и аргумента могут быть разными, например, вы можете добавить все элементы из Set
в List
.
При вызове к списку addAll()
добавляет новые элементы в том же порядке, в котором они находятся в коллекции-аргументе. Вы также можете передать addAll()
позицию, в которую будет вставлен первый элемент из коллекции-аргумента. За ним последуют другие элементы из коллекции-аргумента, сдвигая элементы коллекции-получателя в конец.
fun main() {
val numbers = mutableListOf(1, 2, 5, 6)
numbers.addAll(arrayOf(7, 8))
println(numbers) // [1, 2, 5, 6, 7, 8]
numbers.addAll(2, setOf(3, 4))
println(numbers) // [1, 2, 3, 4, 5, 6, 7, 8]
}
Вы также можете добавлять элементы, используя in-place версию оператора
plus
-
plusAssign
(+=
). При применении к изменяемой коллекции +=
добавляет второй операнд (элемент или другую коллекцию) в конец коллекции.
fun main() {
val numbers = mutableListOf("one", "two")
numbers += "three"
println(numbers) // [one, two, three]
numbers += listOf("four", "five")
println(numbers) // [one, two, three, four, five]
}
Удаление элементов
Чтобы удалить элемент из изменяемой коллекции, используйте функцию
remove()
. Она принимает значение элемента в качестве аргумента и удаляет из коллекции одно вхождение этого значения.
fun main() {
val numbers = mutableListOf(1, 2, 3, 4, 3)
numbers.remove(3) // удаляет только первое значение `3`
println(numbers) // [1, 2, 4, 3]
numbers.remove(5) // ничего не удаляет
println(numbers) // [1, 2, 4, 3]
}
Для одновременного удаления нескольких элементов существуют следующие функции:
* removeAll()
- удаляет все элементы, присутствующие в коллекции-аргументе. В качестве альтернативы вы можете вызвать её с предикатом; в этом случае функция удаляет все элементы, для которых предикат возвращает true
.
* retainAll()
- противоположность removeAll()
: удаляет все элементы кроме тех, что находятся в коллекции-аргументе. При использовании с предикатом она оставляет только те элементы, которые ему соответствуют.
* clear()
- удаляет все элементы из списка, оставляя его пустым.
fun main() {
val numbers = mutableListOf(1, 2, 3, 4)
println(numbers) // [1, 2, 3, 4]
numbers.retainAll { it >= 3 }
println(numbers) // [3, 4]
numbers.clear()
println(numbers) // []
val numbersSet = mutableSetOf("one", "two", "three", "four")
numbersSet.removeAll(setOf("one", "two"))
println(numbersSet) // [three, four]
}
Еще один способ для удаления элементов из коллекции - оператор
minusAssign
(-=
) - это in-place версия оператора minus
. Второй аргумент может быть либо одним элементом, либо другой коллекцией. Если второй аргумент - это элемент, то оператор -=
удалит первое вхождение этого элемента. Если же второй аргумент - это коллекция, то будут удалены все вхождения её элементов. Например, если список содержит повторяющиеся элементы, то они все будут удалены. Второй операнд может содержать элементы, которых нет в коллекции. Такие элементы не влияют на выполнение операции.
fun main() {
val numbers = mutableListOf("one", "two", "three", "three", "four")
numbers -= "three"
println(numbers) // [one, two, three, four]
numbers -= listOf("four", "five")
//numbers -= listOf("four") // делает то же самое, что и выше
println(numbers) // [one, two, three]
}
Обновление элементов
Списки и ассоциативные списки также предоставляют операции для обновления элементов. Они описаны в разделах
List: специфичные операции и Map: специфичные операции.
Для Set
обновление элементов не имеет смысла, поскольку фактически он удаляет элемент и добавляет другой.