Типы коллекций

Типы коллекций

Стандартная библиотека Kotlin предоставляет возможность работы с типами коллекций: Set, List и  Map. Каждый из этих классов имеет два вида:

 - Только для чтения: информация заполняется сразу в коллекцию и дальнейшее изменение невозможно;

- Изменяемый: можно изменять содержимое массива (добавлять, удалять, заменять) элементы. 

Класс Collection

Collection<T> является корневым классом в иерархии коллекций. <T> является условным обозначением типа хранимых объектов в обобщенных классах, в данном случае хранимых объектов в коллекции. При использовании коллекции вместо T подставляется тип – название класса, например: String, Int, Fragment и т.д. Этот интерфейс представляет поведение коллекций только для чтения через который можно получить количество элементов, проверить существование элемента в коллекции и т.д.

Collection является производным от интерфейса Iterable<T>, который определяет операции для итерации элементов. Класс Collection можно использовать в функциях в качестве параметра, через который можно передать различные коллекции функции:

// Объявление функции, которая принимает параметр либо класса Collection, либо производный от Collection
fun printElements(strings: Collection<String>) {
    // Перебор объектов в цикле и печать в консоль
    for (s in strings)
        println("$s ")
}

// Объявление коллекции типа List
val stringList = listOf("first", "second", "third")
// Передача коллекции функции для вывода элементов в консоль
printElements(stringList)

// Объявление коллекции типа Set
val stringSet = setOf("third", "second", "first")
// Передача коллекции функции для вывода элементов в консоль
printElements(stringSet)

Класс List

List<T> хранит элементы в указанном порядке и предоставляет доступ к элементам через индексы. Индексы начинаются с нуля, который соответствует первому элементу и последний индекс равен размеру списка – 1. List в частности используется вместо класса Array, так как является более гибким и удобным.

Доступ к элементам осуществляется посредством функции get, которой передаётся индекс или через оператор []:

// Объявление коллекции типа List
val stringList = listOf("first", "second", "third")
println(stringList.get(0)) // first
println(stringList[1]) // second
println(stringList.size) // 3 - размер массива
println(stringList.indexOf("third")) // 2 - функция возвращает индекс переданного элемента

Функция listOf создаёт список только для чтения в который нельзя добавлять новые элементы или удалять существующие, другими словами размер такого списка (массива) фиксированный и если подразумевается изменение количества элементов списка необходимо использовать mutableListOf, в объекты которого можно добавлять или удалять элементы и чей размер динамически меняется:

var order = mutableListOf<String>("one", "two", "three")
println(order.size) // 3
order.add("four")
println(order.size) // 4 - добавлен новый элемент
order.removeAt(2) // удалить третий элемент, чей индекс равен 2
println(order.size) // 3

Класс Set

Set<T> хранит в себе уникальные элементы, чей порядок в общем не определён. null объекты также являются уникальными и в одном наборе (set) не может быть более одного значения null.

Для создания набора используются функции setOf (для создания набора данных для чтения) и mutableSetOf (с возможностью также изменения элементов) ровно так же как и listOf и mutableListOf.

val stringSet = setOf("third", "second", "first")

Класс Map

Для создания словарей используется класс Map<K, V>, в котором для каждого элемента есть соответствующий ключ, по которому получаем доступ к объекту. Map также является обобщенным классом, каждый элемент которого хранит в себе два экземпляра классов: один для ключа другой для значения. Типы как ключей, так и значений могут быть какими угодно, единственно ключи должны быть уникальными (не повторяться).

Класс Map не является производным от класса Collection, но также является классом для хранения коллекций объектов. Функция mapOf создаёт словарь только для чтения из которого можно считывать данные. Во время инициализации словаря с элементами можно воспользоваться либо конструкцией "ключ to значение", либо создавая экземпляр класса Pair, который получает два параметра – ключ и значение:

val map = mapOf("key1" to 11, "key2" to 22, "key3" to 33, Pair("key4", 44))
// Доступ к элементам словаря можно осуществлять либо посредством функции get(ключ)
println(map.get("key3")) // 33
// Либо через оператор []
println(map["key1"]) // 11

Если необходимо также записывать и удалять элементы из словаря необходимо создать экземпляр класса MutableMap посредством вызова функции mutableMapOf:

val mutableMap = mutableMapOf("key1" to "one", "key2" to "two", "key3" to "three", Pair("key4", "four"))
println(mutableMap.get("key3")) // three
println(mutableMap["key4"]) // four
mutableMap.remove("key2") // Удалить объект с ключом key2
println(mutableMap.size) // 3
mutableMap.put("key5", "five")
// Оператор [] также можно использовать для установки значения в элемент массива
mutableMap["key4"] = "new four"
println(mutableMap["key4"])