Объединение множеств
Часть раздела Логика и управление потоком путешествия по 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() идеальным для объединения связанных коллекций с гарантией отсутствия дубликатов, например, при слиянии наборов навыков, объединении прав пользователей или консолидации данных из нескольких источников.
Чтобы найти элементы, которые присутствуют в обоих множествах, используйте метод intersection(). Он возвращает новое множество, содержащее только общие элементы:
Set<String> sharedSkills = frontendSkills.intersection(backendSkills);
print(sharedSkills); // {JavaScript}Как только у вас появится набор пересекающихся элементов, вы сможете преобразовать его в читаемую строку с помощью метода join(). Это работает так же, как и в List — он объединяет все элементы в одну строку с указанным вами разделителем:
Set<String> overlap = frontendSkills.intersection(backendSkills);
String result = overlap.isEmpty ? 'None' : overlap.join(', ');
print(result); // JavaScriptВместе union(), intersection() и join() предоставляют вам мощные инструменты для сравнения и отображения данных множеств — например, для объединения наборов навыков команды и определения того, какие навыки у них уже есть общие.
Задание
ЛегкоСоздайте программу, которая управляет системой профессионального нетворкинга, объединяя наборы навыков различных членов команды для создания комплексного профиля навыков проекта. Ваша программа должна:
- Прочитать строковый ввод, представляющий название проекта
- Прочитать несколько строковых вводов, представляющих навыки первого члена команды (ввод закончится, когда вы получите
"member1_done") - Прочитать несколько строковых вводов, представляющих навыки второго члена команды (ввод закончится, когда вы получите
"member2_done") - Создать два отдельных Set для хранения навыков каждого члена команды
- Использовать метод
union()для объединения обоих наборов навыков в комплексный профиль навыков проекта - Вывести результаты объединения навыков в точном формате, показанном ниже
Например, если название проекта — "Web Development Project", навыки первого участника — "HTML", "CSS", "JavaScript", "React", а навыки второго участника — "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Если название проекта — "Mobile App Development", навыки первого участника — "Dart", "Flutter", "Firebase", а навыки второго участника — "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Если название проекта — "Data Science Project", навыки первого участника — "Python", "Pandas", "NumPy", "SQL", а навыки второго участника — "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() для объединения обоих наборов навыков
// Найдите пересекающиеся навыки между двумя наборами
// Вычислите общее количество уникальных навыков
// Выведите результаты в требуемом формате
print("Project: $projectName");
print("Team Member 1 skills: $member1Skills");
print("Team Member 2 skills: $member2Skills");
// Выведите объединенные навыки, общее количество, пересекающиеся навыки и статус
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
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Множества
Что такое множество?Создание множестваДобавление и удаление элементовПроверка наличия элементов в множествеПреобразование списка в множествоОбъединение множествПересечение множествРазность множествИтоги: уникальный список гостей