Menu
Coddy logo textTech

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);  // false

Da 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);  // true

Estes 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.

challenge icon

Desafio

Fácil

Crie 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:

  1. Ler uma entrada de string representando o nome do sistema
  2. 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")
  3. Ler uma entrada de string representando o nome de usuário a ser verificado
  4. Ler uma entrada de string representando o nível de permissão a ser verificado
  5. Criar um Map para armazenar nomes de usuário como chaves e seus níveis de permissão como valores
  6. Usar containsKey() para verificar se o nome de usuário existe no sistema
  7. Usar containsValue() para verificar se o nível de permissão especificado existe em qualquer lugar do sistema
  8. 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);  // true

Use containsValue() para verificar se um valor específico existe em qualquer lugar em um Map:

bool hasAdmin = userPermissions.containsValue('admin');
print(hasAdmin);  // true

Ambos 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
}
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