Menu
Coddy logo textTech

Разность множеств

Часть раздела Логика и управление потоком путешествия по Dart на Coddy — урок 24 из 65.

Иногда вам нужно найти элементы, которые существуют в одном Set, но отсутствуют в другом. Метод difference() решает эту задачу, создавая новый набор, содержащий только те элементы из первого набора, которых нет во втором.

Представьте это как вычитание для множеств — вы удаляете все элементы второго множества из первого множества. Метод difference() возвращает новое множество с оставшимися элементами, оставляя оба исходных множества без изменений.

Set<String> todaysTasks = {'email', 'meeting', 'report', 'calls'};
Set<String> completedTasks = {'email', 'calls'};

Set<String> remainingTasks = todaysTasks.difference(completedTasks);
print(remainingTasks);  // {meeting, report}

Эта операция особенно полезна для поиска того, что отсутствует, что осталось сделать или что является уникальным для одной коллекции по сравнению с другой. В отличие от пересечения, которое находит общие черты, разность подчеркивает то, что делает один набор отличным от другого.

challenge icon

Задание

Легко

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

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

Например, если название проекта — "Website Launch", запланированные задачи — "Design mockups", "Write content", "Setup database", "Test functionality", "Deploy site", а завершенные задачи — "Design mockups", "Setup database", ваша программа должна вывести:

Project: Website Launch
Planned tasks: {Design mockups, Write content, Setup database, Test functionality, Deploy site}
Completed tasks: {Design mockups, Setup database}
Remaining tasks: {Write content, Test functionality, Deploy site}
Tasks completed: 2
Tasks remaining: 3
Progress: 40.0% complete
Status: Project in progress - 3 task(s) remaining

Если название проекта — "Mobile App Development", запланированные задачи — "Create wireframes", "Develop UI", "Implement features", а завершенные задачи — "Create wireframes", "Develop UI", "Implement features", ваша программа должна вывести:

Project: Mobile App Development
Planned tasks: {Create wireframes, Develop UI, Implement features}
Completed tasks: {Create wireframes, Develop UI, Implement features}
Remaining tasks: {}
Tasks completed: 3
Tasks remaining: 0
Progress: 100.0% complete
Status: Project completed successfully

Если название проекта — "Marketing Campaign", запланированные задачи — "Research target audience", "Create content", "Design graphics", "Launch campaign", "Analyze results", а завершенные задачи — "Research target audience", ваша программа должна вывести:

Project: Marketing Campaign
Planned tasks: {Research target audience, Create content, Design graphics, Launch campaign, Analyze results}
Completed tasks: {Research target audience}
Remaining tasks: {Create content, Design graphics, Launch campaign, Analyze results}
Tasks completed: 1
Tasks remaining: 4
Progress: 20.0% complete
Status: Project in progress - 4 task(s) remaining

Ваша программа должна использовать метод difference() для поиска задач, которые существуют в наборе запланированных задач, но отсутствуют в наборе завершенных задач. Рассчитайте процент выполнения, разделив количество завершенных задач на общее количество запланированных задач и умножив на 100, с округлением до 1 знака после запятой. Если все задачи завершены, в качестве статуса выведите "Project completed successfully", в противном случае выведите "Project in progress - X task(s) remaining", где X — количество оставшихся задач.

Шпаргалка

Метод difference() создает новый набор, содержащий элементы из первого набора, которых нет во втором наборе:

Set<String> todaysTasks = {'email', 'meeting', 'report', 'calls'};
Set<String> completedTasks = {'email', 'calls'};

Set<String> remainingTasks = todaysTasks.difference(completedTasks);
print(remainingTasks);  // {meeting, report}

Эта операция похожа на вычитание для наборов — она удаляет все элементы второго набора из первого, возвращая новый набор с оставшимися элементами, при этом оба исходных набора остаются без изменений.

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

import 'dart:io';

void main() {
  // Чтение названия проекта
  String? projectName = stdin.readLineSync();
  
  // Чтение запланированных задач до "planned_done"
  Set<String> plannedTasks = <String>{};
  String? task;
  while ((task = stdin.readLineSync()) != "planned_done") {
    if (task != null) {
      plannedTasks.add(task);
    }
  }
  
  // Чтение завершенных задач до "completed_done"
  Set<String> completedTasks = <String>{};
  while ((task = stdin.readLineSync()) != "completed_done") {
    if (task != null) {
      completedTasks.add(task);
    }
  }
  
  // TODO: Напишите свой код ниже
  // Используйте метод difference(), чтобы найти оставшиеся задачи
  // Рассчитайте процент выполнения
  // Определите статус проекта
  
  // Вывод результатов
  print("Project: $projectName");
  print("Planned tasks: $plannedTasks");
  print("Completed tasks: $completedTasks");
  // Добавьте остальные операторы вывода здесь
}
quiz iconПроверьте себя

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

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