Освой Kotlin играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Set (Множество)

Преобразовать список во множество
setOfNotNull() (Kotlin 1.4.0)


В коллекции с интерфейсом Set дубликаты элементов не допускаются, все элементы должны быть уникальными.

Примеры методов для работы с коллекциями смотрите в примерах со списками.

setOf()

Неизменяемая Java-коллекция Set создаётся функцией setOf():


val set = setOf(1, 3, 9)
println(set.javaClass) // class java.util.LinkedHashSet

var intSet: Set<Int> = setOf(1, 2, 3)  // разрешены только Integer

val cats = setOf("Мурзик", "Барсик", "Рыжик")
println(cats)

Если попытаетесь добавить дубликат, то он будет просто отброшен и не попадёт в набор.

Мы не можем обратиться к нужному элементу по индексу через квадратные скобки, как у List. Но мы можем использовать elementAt()


println(cats.elementAt(2))

Разбить на две коллекции по указанному признаку можно через функцию partition():


val setA = setOf(1, 2, 3, 4, 5, 6)
val pair = setA.partition {
    it % 2 == 0
}
println(pair) // ([2, 4, 6], [1, 3, 5])

hashSetOf()

Функция hashSetOf() создаёт изменяемую Java-коллекцию HashSet.


//val intsHashSet: java.util.HashSet<Int> = hashSetOf(1, 2, 3, 4)
val intsHashSet = hashSetOf(1, 2, 3, 4)
intsHashSet.add(5)
intsHashSet.remove(2)
println(intsHashSet::class.java) // class java.util.HashSet
println(intsHashSet.elementAt(2)) // 4

sortedSetOf()

Функция sortedSetOf() создаёт изменяемую Java-коллекцию TreeSet с сортированными значениями.


val intSortedSet  = sortedSetOf(9, 1, 8, 3)
intSortedSet.add(6) // добавляем 6
intSortedSet.remove(1) // удаляем 1
println(intSortedSet::class.java) // class java.util.TreeSet
println(intSortedSet) // выводим отсортированные значения [3, 6, 8, 9]
intSortedSet.clear() // очищаем, будет пусто

linkedSetOf()

Функция linkedSetOf() создаёт изменяемую Java-коллекцию LinkedHashSet в том порядке, в котором были занесены данные.


val intLinkedHashSet = linkedSetOf(15, 6, 7, 2, 3)
intLinkedHashSet.add(44)
intLinkedHashSet.remove(2)
println(intLinkedHashSet::class.java) // class java.util.LinkedHashSet
println(intLinkedHashSet) // [15, 6, 7, 3, 44]
intLinkedHashSet.clear()

MutableSet

Изменяемое множество MutableSet.

Функция add() проверяет, встречается ли переданный объект в MutableSet. Если дубликат будет найден, возвращается false. Но если значение не является дубликатом, оно добавляется в MutableSet (с увеличением размера на 1), а функция возвращает true — признак успешного выполнения операции.


// только Integer
val intMutableSet: MutableSet<Int> = mutableSetOf(3, 27, 66, 12, 10)
intMutableSet.add(8)
intMutableSet.remove(3)
println(intMutableSet::class.java) // class java.util.LinkedHashSet

mutableSetOf()

Объединить два набора можно через методы addAll() или union().


val setA = mutableSetOf<String>("a","b","c")
val setB = mutableSetOf<String>("a","b","c","d")
setB.addAll(setA)
println(setB)
println(setB.union(setA))

Преобразовать список во множество

Можно преобразовать список во множество, тем самым отбросив все повторяющие элементы, через функции toSet() и toMutableSet() (обратное преобразование доступно через toList() и toMutableList().


// список с повторяющимися элементами
val cats = mutableListOf("Рыжик", "Мурзик", "Барсик", "Рыжик")

// конвертируем во множество, удаляя дубликаты
val catSet = cats.toSet()
println(catSet)

// выводит: [Рыжик, Мурзик, Барсик]

Можно сначала преобразовать список во множество, а потом снова в список, в котором уже не будет дубликатов.


val cats = mutableListOf("Рыжик", "Мурзик", "Барсик", "Рыжик")
        .toSet()
        .toList()

Такое преобразование настолько часто применяется, что есть готовая функция distinct(), которая выполняет такую задачу.

setOfNotNull() (Kotlin 1.4.0)

Новая функция отбрасывает null, оставляя остальные элементы.


val set = setOfNotNull(null, 1, 2, 0, null)
println(set) // [1, 2, 0]
Реклама