Класс Set представляет неупорядоченный множество уникальных объектов или множество. Для создания Set применяются фигурные скобки {}
.
Например, пустое множество:
Можно также указать точный тип множества - в этом случае после типа Set в угловых скобках указывается тип элементов множества:
Set<String> set = {};
В данном случае множество представляет множество объектов String.
Можно угловые скобки с типом поставить перед фигурными скобками, что будет аналогично предыдущему примеру:
var set = <String>{};
Обратите внимание, что в обоих случаях явным образом указывается тип данных множества. Иначе, если создается пустой объект:
var set = {};
то в реальности будет создаваться не объект Set, а объект другого типа коллекции - объект Map.
Также в фигурных скобках можно сразу указать значения множества:
var set = {"Tom", "Bob", "Sam"};
Функция print по умолчанию может вывести все элементы множества на консоль:
void main (){ var set = {"Tom", "Bob", "Sam"}; print(set); // {Tom, Bob, Sam} }
Стоит подчеркнуть, что объект Set хранит именно уникальные значения. Если мы попытаемся определить или добавить повторяющиеся значения, то они будут отброшены:
void main (){ var set = {"Tom", "Bob", "Sam", "Tom", "Bob"}; print(set); // {Tom, Bob, Sam} }
Основные свойства класса Set:
first: возвращает первый элемент
last: возвращает последний элемент
length: возвращает длину множества
isEmpty: возвращает true, если множество пусто
isNotEmpty: возвращает true, если множество не пусто
Применение свойств
void main (){ var set = {"Tom", "Bob", "Sam"}; print("Length: ${set.length}"); // 5 print("First: ${set.first}"); // Tom print("Last: ${set.last}"); // Sam print("IsEmpty: ${set.isEmpty}"); // false print("IsNotEmpty: ${set.isNotEmpty}"); // true }
Основные методы множеств:
add(E value): добавляет элемент в множество
addAll(Iterable<E> iterable): добавляет в множество другую коллекцию
clear(): удаляет все элементы из множества
contains(Object element): возвращает true, если элемент содержится в множестве
containsAll(Iterable<Object?> other): возвращает true, если все элементы коллекции other содержатся в множестве
difference(Set<Object> other): возвращает разность текущего множества и множества other в виде другого множества
intersection(Set<Object> other): возвращает пересечение текущего множества и множества other в виде другого множества
remove(Object value): удаляет объект из множества
removeAll(Iterable<Object> elements): удаляет из множества все элементы коллекции elements
union(Set<E&g; other): возвращает объединение двух множеств - текущего и множества other
join([String separator = "" ]): объединяет все элементы множества в строку. Можно указать необязательный параметр separator, который будет раздлять элементы в строке
skip(int count): возвращает коллекцию, в которой отсутствуют первые count элементов
take(int count): возвращает коллекцию, которая содержит первые count элементов
where(bool test(E element)): возвращает коллекцию, элементы которой соответствуют некоторому условию, которое передается в виде функции
forEach(void action(E element)): вызывает для каждого элемента множества функцию action
Полный список полей/методов/конструкторов класса Set можно посмотреть в документации
Для перебора множества можно использовать цикл for..in:
void main (){ var set = {"Tom", "Bob", "Sam"}; for (var name in set){ print(name); } }
Также для перебора множества можно применять метод forEach, который в качестве параметра принимает функцию и вызывает ее для каждого элемента:
void main (){ var set = {"Tom", "Bob", "Sam"}; set.forEach(print); }
В данном случае передаем функцию print, которая получит каждый элемент множества и выведет его на консоль. Другой пример:
void main (){ var set = {"Tom", "Bob", "Sam"}; int i = 1; set.forEach((name)=>print("${i++}.$name")); }
Здесь передаем анонимную функцию, которая получает каждый элемент множества в переменную name и выводит на консоль номер объект (для этого используем внешнбб переменную i) и сам элемент.
Для получения элемента множества по индексу применяется метод elementAt(), в который передается индекс элемента. Индексация начинается с нуля, то есть индекс первого элемента - число 0:
void main (){ var set = {"Tom", "Bob", "Sam", "Kate"}; print(set.elementAt(0)); // Tom print(set.elementAt(1)); // Bob print(set.elementAt(2)); // Sam }
Для добавления одного элемента применяется метод add():
void main (){ var set = {"Tom", "Bob", "Sam"}; set.add("Alice"); print(set); // {Tom, Bob, Sam, Alice} }
Для добавления коллекции применяется метод addAll(), в который передается добавляемая коллекция
void main (){ var set = {"Tom", "Bob", "Sam"}; set.addAll(["Alice", "Kate"]); print(set); // {Tom, Bob, Sam, Alice, Kate} }
Здесь добавляется список ["Alice", "Kate"]
, но это может быть любая коллекция, которая представляет тип Iterable, в том числе и сам Set.
Метод contains() возвращает true, если элемент есть в множестве:
void main (){ var set = {"Tom", "Bob", "Sam"}; print(set.contains("Tom")); // true print(set.contains("Alex")); // false }
Метод containsAll() возвращает true, если все элементы некоторой коллекции имеются в множестве:
void main (){ var set = {"Tom", "Bob", "Sam"}; print(set.containsAll({"Tom", "Bob"})); // true print(set.containsAll({"Tom", "Alex"})); // false }
Для удаления одного элемента применяется метод remove(), в который передается удаляемый элемент:
void main (){ var set = {"Tom", "Bob", "Sam"}; set.remove("Bob"); print(set); // {Tom, Sam} }
Для удаления по условию применяется метод removeWhere(), который передается функция-условие. Эта функция принимает элемент списка и должна возвращать значение типа bool - true, если элемент множества соответствует условию, и false, если не соответствует. Например, удалим из множества все строки, длина которых равна 3 символам:
void main (){ var set = {"Tom", "Alice", "Bob", "Sam", "Kate"}; set.removeWhere((item)=>item.length ==3); // если длина строки - 3 символа print(set); // {Alice, Kate} }
Метод removeAll() удаляет все элементы определенной коллекции, которая передается в метод в качестве параметра:
void main (){ var set = {"Tom", "Alice", "Bob", "Sam", "Kate"}; set.removeAll({"Alice", "Bob", "Alex"}); print(set); // {Tom, Sam, Kate} }
Класс Set также поддерживают стандартные операции над множествами, такие как объединение, пересечение и разность множеств.
Например, у нас есть дву группы студентов, которые учат Dart и Flutter:
var dart = {"Tom", "Alice", "Bob", "Mike"}; // изучают Dart var flutter = {"Tom", "Alice","Sam", "Kate"}; // изучают Flutter
Найдем студентов, которые изучают и Dart, и Flutter одновременно. Для этого применим операцию пересечения множеств в виде метода intersection():
void main (){ var dart = {"Tom", "Alice", "Bob", "Mike"}; // изучают Dart var flutter = {"Tom", "Alice","Sam", "Kate"}; // изучают Flutter var set = dart.intersection(flutter); // учат и dart, и flutter одновременно print(set); // {Tom, Alice} }
Метод intersection()
принимает второе множество, с которым надо выполнить пересечение. Результат метода - новое множество,
полученное при пересечении двух множеств.
Теперь найдем всех студентов из обоих групп. Для этого надо выполнить операцию объединения множеств с помощью метода union()
void main (){ var dart = {"Tom", "Alice", "Bob", "Mike"}; // изучают Dart var flutter = {"Tom", "Alice","Sam", "Kate"}; // изучают Flutter var set = dart.union(flutter); // в обоих группах print(set); // {Tom, Alice, Bob, Mike, Sam, Kate} }
Метод union()
подобно intersection()
принимает второе множество, с которым надо выполнить объединение. Результат
метода - новое множество, полученное при объединении двух множеств.
Теперь найдем студентов, которые изучают Dart, но не изучают Flutter. В этом случае надо применить разность множеств. Для этого у класса Set есть метод , который принимает второе множество, которое надо вычесть, и который возращает результат в виде нового множества:
void main (){ var dart = {"Tom", "Alice", "Bob", "Mike"}; // изучают Dart var flutter = {"Tom", "Alice","Sam", "Kate"}; // изучают Flutter var set = dart.difference(flutter); // изучают dart, но не изучают flutter print(set); // {Bob, Mike} }