Removendo um Par
Parte da seção Logic & Flow do Journey de Rust da Coddy — lição 33 de 66.
Às vezes, você precisa remover dados do seu hash map inteiramente. O Rust fornece o método .remove() para excluir um par chave-valor especificando a chave:
let mut inventory = HashMap::new();
inventory.insert("apples", 50);
inventory.insert("bananas", 30);
// Remove a entrada "apples" completamente
inventory.remove("apples");O método .remove() recebe a chave como um parâmetro e remove tanto a chave quanto seu valor associado do hash map. Após chamar .remove("apples"), tentar buscar por "apples" retornaria None.
Como muitas operações de hash map, .remove() retorna um Option. Ele retorna Some(value) contendo o valor removido se a chave existia, ou None se a chave não foi encontrada:
let removed_value = inventory.remove("bananas");
match removed_value {
Some(count) => println!("Removed {} bananas", count),
None => println!("No bananas found to remove"),
}Este valor de retorno permite que você saiba se a remoção foi bem-sucedida e fornece acesso ao valor que foi removido, o que pode ser útil para operações de log ou limpeza.
Desafio
FácilVocê receberá um número inteiro n indicando a quantidade de itens em um inventário. Em seguida, você receberá n pares de entradas: o nome de um item seguido por sua quantidade (como um número inteiro). Depois disso, você receberá mais uma entrada com o nome de um item para remover do inventário. Crie um hash map para armazenar o inventário, insira todos os itens, remova o item especificado e imprima o resultado da remoção junto com o inventário restante.
Requisitos:
- Importe
HashMapdestd::collections - Crie um hash map mutável com os tipos
HashMap<String, i32> - Leia a primeira entrada e converta-a para
i32para obter o número de itens - Use um loop para ler
npares de entradas (nome do item, depois a quantidade) - Insira cada item e sua quantidade no hash map
- Leia mais uma entrada como o nome do item a ser removido
- Use
.remove()para remover o item do hash map - Use
matchpara tratar oOptionretornado por.remove() - Se o item foi encontrado e removido, imprima:
Removed [quantity] [item_name] - Se o item não foi encontrado, imprima:
[item_name] not found - Após tratar a remoção, itere sobre o hash map restante e imprima cada item no formato:
[item_name]: [quantity]
Entrada:
- Primeira linha: Um número inteiro
n(ex:3) - Próximos
npares de linhas:- Nome do item (ex:
apples) - Quantidade como um número inteiro (ex:
50)
- Nome do item (ex:
- Última linha: Nome do item para remover (ex:
bananas)
Saída:
- Primeira linha: Ou
Removed [quantity] [item_name]ou[item_name] not found - Linhas seguintes: Uma linha para cada item restante no formato:
[item_name]: [quantity] - A ordem dos itens restantes pode variar entre as execuções de teste
Folha de consulta
Para remover um par chave-valor de um hash map, use o método .remove() com a chave como parâmetro:
let mut inventory = HashMap::new();
inventory.insert("apples", 50);
inventory.insert("bananas", 30);
inventory.remove("apples");O método .remove() retorna um Option: Some(value) se a chave existia, ou None se ela não foi encontrada:
let removed_value = inventory.remove("bananas");
match removed_value {
Some(count) => println!("Removed {} bananas", count),
None => println!("No bananas found to remove"),
}Experimente você mesmo
use std::collections::HashMap;
use std::io::{self, BufRead};
fn main() {
let stdin = io::stdin();
let mut lines = stdin.lock().lines();
// Lê o número de itens
let n: i32 = lines.next().unwrap().unwrap().trim().parse().unwrap();
// Cria um hash map mutável para armazenar o inventário
let mut inventory: HashMap<String, i32> = HashMap::new();
// Lê n pares de entradas (nome do item e quantidade)
for _ in 0..n {
let item_name = lines.next().unwrap().unwrap().trim().to_string();
let quantity: i32 = lines.next().unwrap().unwrap().trim().parse().unwrap();
// TODO: Insere o item e a quantidade no hash map
}
// Lê o nome do item a ser removido
let item_to_remove = lines.next().unwrap().unwrap().trim().to_string();
// TODO: Remove o item do hash map e trata o resultado usando match
// Imprime o resultado da remoção (ou "Removed [quantity] [item_name]" ou "[item_name] not found")
// TODO: Itera sobre o inventário restante e imprime cada item no formato "[item_name]: [quantity]"
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Logic & Flow
1Fluxo de Controle Avançado
A Expressão 'match'Correspondência de Múltiplos ValoresCorrespondência de IntervalosA Expressão 'if let'Loops como ExpressõesRecapitulação - Parser de Comandos Simples4Agrupando Dados com Structs
O que é uma Struct?Visão Geral de StructsAcessando Campos de uma StructStructs MutáveisStructs como Parâmetros de FunçãoTuple StructsRecapitulação - Criando uma Struct Book2Introdução a Vetores
O que é um Vetor?Criando um VetorAdicionando Elementos com pushAcessando Elementos do VetorIterando sobre um VetorIteração MutávelRemovendo ElementosRecapitulação - Rastreador de Pontuação Básico5Pares Chave-Valor com Hash Maps
O que é um Hash Map?Criando um Hash MapInserindo Pares Chave-ValorAcessando ValoresIterando sobre um Hash MapAtualizando um ValorRemovendo um ParRecapitulação - Contador de Palavras8Projeto: Inventário Simples de Itens
Configuração do ProjetoAdicionando um ItemVerificando o EstoqueVendendo um ItemJuntando tudo3Lista de Tarefas via Linha de Comando
Configuração do ProjetoAdicionando uma TarefaVisualizando Todas as TarefasRemovendo uma TarefaCódigo Final