Menu
Coddy logo textTech

Diferença de Conjuntos

Parte da seção Lógica & Fluxo do Journey de Dart da Coddy — lição 24 de 65.

Às vezes, você precisa encontrar elementos que existem em um Set mas não em outro. O método difference() resolve isso criando um novo conjunto contendo apenas os elementos do primeiro conjunto que não estão presentes no segundo conjunto.

Pense nisso como uma subtração para conjuntos - você está removendo todos os elementos do segundo conjunto do primeiro conjunto. O método difference() retorna um novo conjunto com os elementos restantes, deixando ambos os conjuntos originais inalterados.

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

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

Esta operação é particularmente útil para encontrar o que está faltando, o que resta a fazer ou o que é exclusivo de uma coleção em comparação com outra. Ao contrário da interseção, que encontra semelhanças, a diferença destaca o que torna um conjunto distinto de outro.

challenge icon

Desafio

Fácil

Crie um programa que gerencie um sistema de gerenciamento de projetos, identificando tarefas que foram planejadas, mas ainda não foram concluídas. Seu programa deve:

  1. Ler uma entrada de string representando o nome do projeto
  2. Ler múltiplas entradas de string representando as tarefas planejadas (a entrada terminará quando você receber "planned_done")
  3. Ler múltiplas entradas de string representando as tarefas concluídas (a entrada terminará quando você receber "completed_done")
  4. Criar dois Sets separados para armazenar as tarefas planejadas e as tarefas concluídas
  5. Usar o método difference() para encontrar tarefas que estão planejadas, mas ainda não foram concluídas
  6. Imprimir a análise do status do projeto no formato exato mostrado abaixo

Por exemplo, se o nome do projeto for "Website Launch", as tarefas planejadas forem "Design mockups", "Write content", "Setup database", "Test functionality", "Deploy site", e as tarefas concluídas forem "Design mockups", "Setup database", seu programa deve exibir:

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

Se o nome do projeto for "Mobile App Development", as tarefas planejadas forem "Create wireframes", "Develop UI", "Implement features", e as tarefas concluídas forem "Create wireframes", "Develop UI", "Implement features", seu programa deve exibir:

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

Se o nome do projeto for "Marketing Campaign", as tarefas planejadas forem "Research target audience", "Create content", "Design graphics", "Launch campaign", "Analyze results", e as tarefas concluídas forem "Research target audience", seu programa deve exibir:

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

Seu programa deve usar o método difference() para encontrar tarefas que existem no Set de tarefas planejadas, mas não no Set de tarefas concluídas. Calcule a porcentagem de progresso dividindo as tarefas concluídas pelo total de tarefas planejadas e multiplicando por 100, arredondado para 1 casa decimal. Se todas as tarefas forem concluídas, mostre "Project completed successfully" como o status, caso contrário, mostre "Project in progress - X task(s) remaining", onde X é o número de tarefas restantes.

Folha de consulta

O método difference() cria um novo conjunto contendo elementos do primeiro conjunto que não estão presentes no segundo conjunto:

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

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

Esta operação é como uma subtração para conjuntos - ela remove todos os elementos do segundo conjunto do primeiro conjunto, retornando um novo conjunto com os elementos restantes, enquanto deixa ambos os conjuntos originais inalterados.

Experimente você mesmo

import 'dart:io';

void main() {
  // Ler o nome do projeto
  String? projectName = stdin.readLineSync();
  
  // Ler tarefas planejadas até "planned_done"
  Set<String> plannedTasks = <String>{};
  String? task;
  while ((task = stdin.readLineSync()) != "planned_done") {
    if (task != null) {
      plannedTasks.add(task);
    }
  }
  
  // Ler tarefas concluídas até "completed_done"
  Set<String> completedTasks = <String>{};
  while ((task = stdin.readLineSync()) != "completed_done") {
    if (task != null) {
      completedTasks.add(task);
    }
  }
  
  // TODO: Escreva seu código abaixo
  // Use o método difference() para encontrar as tarefas restantes
  // Calcular a porcentagem de progresso
  // Determinar o status do projeto
  
  // Exibir os resultados
  print("Project: $projectName");
  print("Planned tasks: $plannedTasks");
  print("Completed tasks: $completedTasks");
  // Adicione as instruções de saída restantes aqui
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Lógica & Fluxo