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.
Desafio
FácilCrie 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:
- Ler uma entrada de string representando o nome do projeto
- Ler múltiplas entradas de string representando as tarefas planejadas (a entrada terminará quando você receber
"planned_done") - Ler múltiplas entradas de string representando as tarefas concluídas (a entrada terminará quando você receber
"completed_done") - Criar dois Sets separados para armazenar as tarefas planejadas e as tarefas concluídas
- Usar o método
difference()para encontrar tarefas que estão planejadas, mas ainda não foram concluídas - 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) remainingSe 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 successfullySe 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) remainingSeu 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
}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
1Manipulação Avançada de Listas
Propriedades de Lista: first & lastEstado da Lista: isEmpty & isNotEmptyInvertendo uma ListaAdicionando a uma Lista: insertRemoção em Listas: removeWhereBuscando em uma Lista: indexOfOrdenando uma ListaEmbaralhando uma ListaRecapitulação - Organizador de Listas4Manipulação Avançada de Mapas
Iterando sobre um MapVerificando Chaves e ValoresPropriedades do Map: keys & valuesAdição Condicional: putIfAbsentRemovendo Entradas de um MapMaps AninhadosRecapitulação - Atualização de Inventário2Operações Funcionais em Listas
Transformando com 'map'Filtrando com 'where'Usando '.toList()'Verificando Condições com 'any'Condições com 'every'Encontrando com 'firstWhere'Recapitulação - Filtragem de Dados5Projeto: Cálculo de Carrinho de Compras
Configuração do ProjetoAdicionando Itens ao Carrinho3Conjuntos
O que é um Conjunto?Criando um ConjuntoAdicionando e Removendo de ConjuntosVerificando Elementos em um ConjuntoConvertendo uma Lista para um ConjuntoUnião de ConjuntosInterseção de ConjuntosDiferença de ConjuntosRecapitulação - Lista de Convidados Únicos