Menu
Coddy logo textTech

Propriedades do Map: keys & values

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

Ao trabalhar com coleções Map, às vezes você precisa extrair todas as chaves ou todos os valores separadamente. O Dart fornece duas propriedades convenientes para isso: .keys e .values.

A propriedade .keys retorna um iterável contendo todas as chaves do mapa, enquanto .values retorna um iterável contendo todos os valores correspondentes. Essas propriedades são particularmente úteis quando você precisa processar chaves e valores de forma independente.

Map<String, double> inventory = {
  'Laptop': 999.99,
  'Mouse': 25.50,
  'Keyboard': 75.00
};

Iterable<String> productNames = inventory.keys;
Iterable<double> prices = inventory.values;

print(productNames);  // (Laptop, Mouse, Keyboard)
print(prices);        // (999.99, 25.5, 75.0)

Como essas propriedades retornam iteráveis em vez de listas, você pode convertê-las em listas usando .toList() se precisar de funcionalidades específicas de lista. Essa separação de chaves e valores é especialmente útil quando você precisa analisar ou manipular um aspecto dos seus dados independentemente do outro.

challenge icon

Desafio

Fácil

Crie um programa que gerencie um sistema de biblioteca digital analisando coleções de livros e extraindo informações sobre títulos e seus anos de publicação. Seu programa deve:

  1. Ler uma entrada de string representando o nome da biblioteca
  2. Ler múltiplos pares de entradas representando títulos de livros e seus anos de publicação (a entrada terminará quando você receber "catalog_done")
  3. Criar um Map para armazenar cada título de livro como a chave e seu ano de publicação como o valor
  4. Usar a propriedade .keys para extrair todos os títulos dos livros e convertê-los em uma List
  5. Usar a propriedade .values para extrair todos os anos de publicação e convertê-los em uma List
  6. Encontrar o livro mais antigo identificando o ano mínimo dos valores
  7. Encontrar o livro mais novo identificando o ano máximo dos valores
  8. Imprimir a análise da biblioteca no formato exato mostrado abaixo

Por exemplo, se o nome da biblioteca for "Central Library" e o catálogo incluir "To Kill a Mockingbird" com o ano 1960, "1984" com o ano 1949, "The Great Gatsby" com o ano 1925, "Harry Potter" com o ano 1997, seu programa deve exibir:

Library: Central Library
Book Collection Analysis:
All book titles: [To Kill a Mockingbird, 1984, The Great Gatsby, Harry Potter]
All publication years: [1960, 1949, 1925, 1997]
Total books in collection: 4
Oldest book year: 1925
Newest book year: 1997
Collection span: 72 years
Status: Library catalog analysis completed

Se o nome da biblioteca for "University Library" e o catálogo incluir "Pride and Prejudice" com o ano 1813, "Moby Dick" com o ano 1851, "Brave New World" com o ano 1932, seu programa deve exibir:

Library: University Library
Book Collection Analysis:
All book titles: [Pride and Prejudice, Moby Dick, Brave New World]
All publication years: [1813, 1851, 1932]
Total books in collection: 3
Oldest book year: 1813
Newest book year: 1932
Collection span: 119 years
Status: Library catalog analysis completed

Se o nome da biblioteca for "Community Library" e o catálogo incluir "The Hobbit" com o ano 1937, "Dune" com o ano 1965, "Neuromancer" com o ano 1984, "The Martian" com o ano 2011, "Klara and the Sun" com o ano 2021, seu programa deve exibir:

Library: Community Library
Book Collection Analysis:
All book titles: [The Hobbit, Dune, Neuromancer, The Martian, Klara and the Sun]
All publication years: [1937, 1965, 1984, 2011, 2021]
Total books in collection: 5
Oldest book year: 1937
Newest book year: 2021
Collection span: 84 years
Status: Library catalog analysis completed

Seu programa deve usar a propriedade .keys para extrair todos os títulos dos livros e a propriedade .values para extrair todos os anos de publicação. Converta ambos os iteráveis para Lists usando .toList(). Calcule o intervalo da coleção subtraindo o ano mais antigo do ano mais novo. O formato de entrada será: nome da biblioteca, depois títulos de livros e anos de publicação alternados (como strings que precisam ser convertidas para inteiros), terminando com "catalog_done".

Folha de consulta

Use .keys para extrair todas as chaves de um Map e .values para extrair todos os valores:

Map<String, double> inventory = {
  'Laptop': 999.99,
  'Mouse': 25.50,
  'Keyboard': 75.00
};

Iterable<String> productNames = inventory.keys;
Iterable<double> prices = inventory.values;

print(productNames);  // (Laptop, Mouse, Keyboard)
print(prices);        // (999.99, 25.5, 75.0)

Converta iteráveis em listas usando .toList() para funcionalidades específicas de lista:

List<String> namesList = inventory.keys.toList();
List<double> pricesList = inventory.values.toList();

Experimente você mesmo

import 'dart:io';

void main() {
  // Ler o nome da biblioteca
  String? libraryName = stdin.readLineSync();
  
  // Criar um Map para armazenar títulos de livros e anos de publicação
  Map<String, int> bookCatalog = {};
  
  // Ler títulos e anos dos livros até "catalog_done"
  while (true) {
    String? input = stdin.readLineSync();
    if (input == "catalog_done") {
      break;
    }
    String bookTitle = input!;
    String? yearInput = stdin.readLineSync();
    int publicationYear = int.parse(yearInput!);
    bookCatalog[bookTitle] = publicationYear;
  }
  
  // TODO: Escreva seu código abaixo
  // Extrair títulos dos livros usando a propriedade .keys e converter para List
  // Extrair anos de publicação usando a propriedade .values e converter para List
  // Encontrar os anos mais antigo e mais novo
  // Calcular o intervalo da coleção
  // Imprimir a análise da biblioteca no formato exigido
  
  print("Library: $libraryName");
  print("Book Collection Analysis:");
  // Adicione suas instruções de saída 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