Verificando Chaves e Valores
Parte da seção Lógica & Fluxo do Journey de Dart da Coddy — lição 27 de 65.
Antes de acessar dados em um Map, é essencial verificar se a chave ou o valor que você está procurando realmente existe. O Dart fornece dois métodos para isso: containsKey() e containsValue().
O método containsKey() verifica se uma chave específica existe no mapa, retornando true se for encontrada e false caso contrário. Isso é particularmente útil antes de tentar acessar um valor, ajudando você a evitar erros potenciais.
Map<String, String> userPermissions = {
'user123': 'admin',
'user456': 'editor',
'user789': 'viewer'
};
bool hasUser = userPermissions.containsKey('user123');
print(hasUser); // true
bool hasUnknownUser = userPermissions.containsKey('user999');
print(hasUnknownUser); // falseDa mesma forma, containsValue() verifica se um valor específico existe em qualquer lugar no mapa. Este método pesquisa em todos os valores e retorna true se encontrar uma correspondência.
bool hasAdmin = userPermissions.containsValue('admin');
print(hasAdmin); // trueEstes métodos são cruciais para escrever código seguro que lida com dados ausentes de forma elegante, prevenindo erros em tempo de execução ao trabalhar com conteúdos de mapas dinâmicos.
Desafio
FácilCrie um programa que gerencie um sistema de autenticação de usuários, verificando as credenciais do usuário e checando os níveis de permissão. Seu programa deve:
- Ler uma entrada de string representando o nome do sistema
- Ler múltiplos pares de entradas representando nomes de usuário e seus níveis de permissão (a entrada terminará quando você receber
"users_done") - Ler uma entrada de string representando o nome de usuário a ser verificado
- Ler uma entrada de string representando o nível de permissão a ser verificado
- Criar um Map para armazenar nomes de usuário como chaves e seus níveis de permissão como valores
- Usar
containsKey()para verificar se o nome de usuário existe no sistema - Usar
containsValue()para verificar se o nível de permissão especificado existe em qualquer lugar do sistema - Imprimir a análise de autenticação no formato exato mostrado abaixo
Por exemplo, se o nome do sistema for "Corporate Network", os usuários incluírem "alice" com "admin", "bob" com "editor", "charlie" com "viewer", "diana" com "admin", o nome de usuário a verificar for "alice" e o nível de permissão a verificar for "admin", seu programa deve exibir:
System: Corporate Network
User Database: {alice: admin, bob: editor, charlie: viewer, diana: admin}
Authentication Check:
Username 'alice' exists: true
Permission 'admin' exists in system: true
User 'alice' has permission 'admin': true
Access Status: GRANTED - User authenticated with valid permissions
Security Level: High (admin access detected)Se o nome do sistema for "School Portal", os usuários incluírem "teacher1" com "instructor", "student1" com "student", "admin1" com "administrator", o nome de usuário a verificar for "guest" e o nível de permissão a verificar for "student", seu programa deve exibir:
System: School Portal
User Database: {teacher1: instructor, student1: student, admin1: administrator}
Authentication Check:
Username 'guest' exists: false
Permission 'student' exists in system: true
User 'guest' has permission 'student': false
Access Status: DENIED - Username not found in system
Security Level: Low (user not registered)Se o nome do sistema for "Library System", os usuários incluírem "librarian" com "staff", "member1" com "member", "member2" com "member", o nome de usuário a verificar for "librarian" e o nível de permissão a verificar for "premium", seu programa deve exibir:
System: Library System
User Database: {librarian: staff, member1: member, member2: member}
Authentication Check:
Username 'librarian' exists: true
Permission 'premium' exists in system: false
User 'librarian' has permission 'premium': false
Access Status: DENIED - Permission level not available
Security Level: Medium (valid user, invalid permission)Seu programa deve usar containsKey() para verificar se o nome de usuário existe e containsValue() para verificar se o nível de permissão existe em qualquer lugar do sistema. Para verificar se o usuário específico possui a permissão específica, compare o nível de permissão real do usuário com o solicitado. Determine o nível de segurança com base nos resultados: "High" se o acesso for concedido com permissões do tipo admin (admin, administrator, staff), "Medium" se o usuário existir mas tiver permissões erradas, e "Low" se o usuário não existir. O formato de entrada será: nome do sistema, depois nomes de usuário e níveis de permissão alternados, terminando com "users_done", seguido pelo nome de usuário a verificar e o nível de permissão a verificar.
Folha de consulta
Use containsKey() para verificar se uma chave específica existe em um Map:
Map<String, String> userPermissions = {
'user123': 'admin',
'user456': 'editor',
'user789': 'viewer'
};
bool hasUser = userPermissions.containsKey('user123');
print(hasUser); // trueUse containsValue() para verificar se um valor específico existe em qualquer lugar em um Map:
bool hasAdmin = userPermissions.containsValue('admin');
print(hasAdmin); // trueAmbos os métodos retornam true se encontrado e false caso contrário, ajudando a prevenir erros de tempo de execução ao trabalhar com conteúdos de mapas dinâmicos.
Experimente você mesmo
import 'dart:io';
void main() {
// Ler o nome do sistema
String? systemName = stdin.readLineSync();
// Criar um Map para armazenar nomes de usuário e seus níveis de permissão
Map<String, String> userDatabase = {};
// Ler dados do usuário até "users_done"
while (true) {
String? input = stdin.readLineSync();
if (input == "users_done") {
break;
}
String username = input!;
String? permission = stdin.readLineSync();
userDatabase[username] = permission!;
}
// Ler o nome de usuário para verificar e o nível de permissão para validar
String? usernameToCheck = stdin.readLineSync();
String? permissionToVerify = stdin.readLineSync();
// TODO: Escreva seu código abaixo
// Use containsKey() para verificar se o nome de usuário existe
// Use containsValue() para verificar se o nível de permissão existe no sistema
// Verifique se o usuário específico possui a permissão específica
// Determine o status de acesso e o nível de segurança:
// - "High (admin access detected)" se o acesso for concedido E a permissão for admin, administrator ou staff
// - "Medium (standard access)" se o acesso for concedido, mas a permissão não for do tipo admin
// - "Medium (valid user, invalid permission)" se o usuário existir, mas tiver a permissão errada
// - "Low (user not registered)" se o usuário não existir
// Imprimir a análise de autenticação
print("System: $systemName");
print("User Database: $userDatabase");
print("Authentication Check:");
// Adicione suas instruções de saída 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