Set

Последнее обновление: 06.04.2023

Класс 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

Основные свойства класса 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
}

Методы класса Set

Основные методы множеств:

  • 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}
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850