Объединение множеств
Часть раздела Логика и управление потоком путешествия по Dart на Coddy. Урок 22 из 65.
Если у вас есть две отдельные коллекции Set, вы можете объединить их в один набор, содержащий все уникальные элементы из обоих, с помощью метода union(). Эта операция создаёт новый набор, включающий каждый элемент, который встречается хотя бы в одном из исходных наборов.
Метод union() автоматически обрабатывает дубликаты за вас. Если один и тот же элемент существует в обоих множествах, он появится только один раз в результирующем объединении множеств, сохраняя фундаментальное свойство: множества содержат только уникальные значения.
Set<String> frontendSkills = {'HTML', 'CSS', 'JavaScript'};
Set<String> backendSkills = {'JavaScript', 'Python', 'SQL'};
Set<String> allSkills = frontendSkills.union(backendSkills);
print(allSkills); // {HTML, CSS, JavaScript, Python, SQL}Обратите внимание, что 'JavaScript' присутствует в обоих исходных наборах, но в результате объединения встречается только один раз. Это делает union() идеальным для объединения связанных коллекций с гарантией отсутствия дубликатов, например при объединении наборов навыков, объединении разрешений пользователей или консолидации данных из нескольких источников.
Чтобы найти элементы, которые встречаются в both множествах, используйте метод intersection(). Он возвращает новое множество, содержащее только общие элементы:
Set<String> sharedSkills = frontendSkills.intersection(backendSkills);
print(sharedSkills); // {JavaScript}Получив набор overlapping элементов, вы можете преобразовать его в читаемую строку с помощью метода join(). Это работает так же, как и с List. Метод объединяет все элементы в одну строку с разделителем, который вы укажете:
Set<String> overlap = frontendSkills.intersection(backendSkills);
String result = overlap.isEmpty ? 'None' : overlap.join(', ');
print(result); // JavaScriptВместе union(), intersection() и join() предоставляют мощные инструменты для сравнения и отображения данных множеств, например для объединения наборов навыков команд и определения навыков, которые у них уже совпадают.
Задание
ЛегкоСоздайте программу, которая управляет системой профессиональных связей, объединяя наборы навыков разных членов команды для создания комплексного профиля навыков Project. Ваша программа должна:
- Считать строковый ввод, представляющий название Project
- Считать несколько строковых вводов, представляющих навыки первого member (ввод завершится, когда вы получите
"member1_done") - Считать несколько строковых вводов, представляющих навыки второго member (ввод завершится, когда вы получите
"member2_done") - Создать два отдельных множества для хранения навыков каждого member
- Использовать метод
union(), чтобы объединить оба набора навыков в комплексный профиль навыков Project - Вывести результаты объединения навыков в точном формате, показанном ниже
Например, если название Project — "Web Development Project", навыки первого member — "HTML", "CSS", "JavaScript", "React", а навыки второго member — "JavaScript", "Node.js", "MongoDB", "React", ваша программа должна вывести:
Project: Web Development Project
Team Member 1 skills: {HTML, CSS, JavaScript, React}
Team Member 2 skills: {JavaScript, Node.js, MongoDB, React}
Combined project skills: {HTML, CSS, JavaScript, React, Node.js, MongoDB}
Total unique skills available: 6
Overlapping skills: JavaScript, React
Status: Project skill profile created successfullyЕсли название Project — "Mobile App Development", навыки первого member — "Dart", "Flutter", "Firebase", а навыки второго member — "Swift", "iOS", "Xcode", ваша программа должна вывести:
Project: Mobile App Development
Team Member 1 skills: {Dart, Flutter, Firebase}
Team Member 2 skills: {Swift, iOS, Xcode}
Combined project skills: {Dart, Flutter, Firebase, Swift, iOS, Xcode}
Total unique skills available: 6
Overlapping skills: None
Status: Project skill profile created successfullyЕсли название Project — "Data Science Project", навыки первого member — "Python", "Pandas", "NumPy", "SQL", а навыки второго member — "Python", "SQL", "Tableau", "Statistics", ваша программа должна вывести:
Project: Data Science Project
Team Member 1 skills: {Python, Pandas, NumPy, SQL}
Team Member 2 skills: {Python, SQL, Tableau, Statistics}
Combined project skills: {Python, Pandas, NumPy, SQL, Tableau, Statistics}
Total unique skills available: 6
Overlapping skills: Python, SQL
Status: Project skill profile created successfullyВаша программа должна использовать метод union(), чтобы объединить два набора навыков и продемонстрировать, как он автоматически обрабатывает дубликаты. Сначала выведите отдельные наборы навыков, затем объединённый результат. Определите все пересекающиеся навыки, найдя навыки, которые присутствуют в обоих исходных наборах. Если пересекающихся навыков нет, выведите "None" в строке пересекающихся навыков.
Попробуйте сами
import 'dart:io';
void main() {
// Читать название проекта
String? projectName = stdin.readLineSync();
// Читать навыки первого участника команды
Set<String> member1Skills = <String>{};
String? skill;
while ((skill = stdin.readLineSync()) != "member1_done") {
if (skill != null) {
member1Skills.add(skill);
}
}
// Читать навыки второго участника команды
Set<String> member2Skills = <String>{};
while ((skill = stdin.readLineSync()) != "member2_done") {
if (skill != null) {
member2Skills.add(skill);
}
}
// TODO: Напишите ваш код ниже
// Используйте метод union() для объединения обоих наборов навыков
// Find overlapping skills between the two sets
// Calculate total unique skills
// Вывести результаты в требуемом формате
print("Project: $projectName");
print("Team Member 1 skills: $member1Skills");
print("Team Member 2 skills: $member2Skills");
// Print combined skills, total count, overlapping skills, and status
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутая работа со списками
Свойства списка: first и lastСостояние списка: isEmpty и isNotEmptyРазворот спискаДобавление в список: insertУдаление из списка: removeWhereПоиск в списке: indexOfСортировка спискаПеремешивание спискаИтоги — Органайзер списков4Продвинутая работа с Map
Итерация по MapПроверка ключей и значенийСвойства Map: keys и valuesУсловное добавление: putIfAbsentУдаление записей из MapВложенные MapИтоги — Обновление инвентаря2Функциональные операции со списками
Преобразование с помощью 'map'Фильтрация с помощью 'where'Использование '.toList()'Проверка условий с помощью 'any'Условия с 'every'Поиск с помощью 'firstWhere'Повторение — фильтрация данных5Проект: Калькулятор корзины
Настройка проектаДобавление товаров в корзину3Множества
Что такое множество?Создание множестваДобавление и удаление элементовПроверка наличия элементов в множествеПреобразование списка в множествоОбъединение множествПересечение множествРазность множествИтоги: уникальный список гостейПотренируйтесь самостоятельно: Онлайн-компилятор Dart