Menu
Coddy logo textTech

Объединение множеств

Часть раздела Логика и управление потоком путешествия по 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() предоставляют мощные инструменты для сравнения и отображения данных множеств, например для объединения наборов навыков команд и определения навыков, которые у них уже совпадают.

challenge icon

Задание

Легко

Создайте программу, которая управляет системой профессиональных связей, объединяя наборы навыков разных членов команды для создания комплексного профиля навыков Project. Ваша программа должна:

  1. Считать строковый ввод, представляющий название Project
  2. Считать несколько строковых вводов, представляющих навыки первого member (ввод завершится, когда вы получите "member1_done")
  3. Считать несколько строковых вводов, представляющих навыки второго member (ввод завершится, когда вы получите "member2_done")
  4. Создать два отдельных множества для хранения навыков каждого member
  5. Использовать метод union(), чтобы объединить оба набора навыков в комплексный профиль навыков Project
  6. Вывести результаты объединения навыков в точном формате, показанном ниже

Например, если название 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" в строке пересекающихся навыков.

REQUIRED OUTPUT FORMAT: [Your translated content here]

Попробуйте сами

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
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком

Потренируйтесь самостоятельно: Онлайн-компилятор Dart