Освой Kotlin играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Преобразовать список во множество
setOfNotNull() (Kotlin 1.4.0)
В коллекции с интерфейсом Set дубликаты элементов не допускаются, все элементы должны быть уникальными.
Примеры методов для работы с коллекциями смотрите в примерах со списками.
Неизменяемая 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() создаёт изменяемую 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() создаёт изменяемую 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() создаёт изменяемую 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.
Функция 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
Объединить два набора можно через методы 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(), которая выполняет такую задачу.
Новая функция отбрасывает null, оставляя остальные элементы.
val set = setOfNotNull(null, 1, 2, 0, null)
println(set) // [1, 2, 0]