Menu
Coddy logo textTech

Comprobación de claves y valores

Parte de la sección Lógica y Flujo del Journey de Dart de Coddy — lección 27 de 65.

Antes de acceder a los datos en un Map, es esencial verificar que la clave o el valor que estás buscando realmente exista. Dart proporciona dos métodos para esto: containsKey() y containsValue().

El método containsKey() comprueba si una clave específica existe en el mapa, devolviendo true si se encuentra y false en caso contrario. Esto es especialmente útil antes de intentar acceder a un valor, lo que ayuda a evitar posibles errores.

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

Del mismo modo, containsValue() comprueba si un valor específico existe en cualquier lugar del mapa. Este método busca a través de todos los valores y devuelve true si encuentra una coincidencia.

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

Estos métodos son cruciales para escribir código seguro que maneje datos faltantes de manera elegante, evitando errores de tiempo de ejecución al trabajar con contenidos de mapas dinámicos.

challenge icon

Desafío

Fácil

Crea un programa que gestione un sistema de autenticación de usuarios verificando las credenciales de los usuarios y comprobando los niveles de permiso. Tu programa debe:

  1. Leer una entrada de cadena que represente el nombre del sistema
  2. Leer múltiples pares de entradas que representen nombres de usuario y sus niveles de permiso (la entrada terminará cuando recibas "users_done")
  3. Leer una entrada de cadena que represente el nombre de usuario a verificar
  4. Leer una entrada de cadena que represente el nivel de permiso a verificar
  5. Crear un Map para almacenar los nombres de usuario como claves y sus niveles de permiso como valores
  6. Usar containsKey() para comprobar si el nombre de usuario existe en el sistema
  7. Usar containsValue() para comprobar si el nivel de permiso especificado existe en cualquier parte del sistema
  8. Imprimir el análisis de autenticación en el formato exacto que se muestra a continuación

Por ejemplo, si el nombre del sistema es "Corporate Network", los usuarios incluyen a "alice" con "admin", "bob" con "editor", "charlie" con "viewer", "diana" con "admin", el nombre de usuario a verificar es "alice", y el nivel de permiso a verificar es "admin", tu programa debería mostrar:

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)

Si el nombre del sistema es "School Portal", los usuarios incluyen a "teacher1" con "instructor", "student1" con "student", "admin1" con "administrator", el nombre de usuario a verificar es "guest", y el nivel de permiso a verificar es "student", tu programa debería mostrar:

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)

Si el nombre del sistema es "Library System", los usuarios incluyen a "librarian" con "staff", "member1" con "member", "member2" con "member", el nombre de usuario a verificar es "librarian", y el nivel de permiso a verificar es "premium", tu programa debería mostrar:

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)

Tu programa debe usar containsKey() para verificar si el nombre de usuario existe y containsValue() para comprobar si el nivel de permiso existe en cualquier parte del sistema. Para verificar si el usuario específico tiene el permiso específico, compara el nivel de permiso real del usuario con el solicitado. Determina el nivel de seguridad basándote en los resultados: "High" si se concede el acceso con permisos de tipo administrador (admin, administrator, staff), "Medium" si el usuario existe pero tiene permisos incorrectos, y "Low" si el usuario no existe. El formato de entrada será: nombre del sistema, luego nombres de usuario y niveles de permiso alternados, terminando con "users_done", seguido por el nombre de usuario a verificar y el nivel de permiso a verificar.

Hoja de referencia

Usa containsKey() para comprobar si una clave específica existe en un Map:

Map<String, String> userPermissions = {
  'user123': 'admin',
  'user456': 'editor',
  'user789': 'viewer'
};

bool hasUser = userPermissions.containsKey('user123');
print(hasUser);  // true

Usa containsValue() para comprobar si un valor específico existe en cualquier lugar de un Map:

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

Ambos métodos devuelven true si se encuentra y false en caso contrario, lo que ayuda a prevenir errores en tiempo de ejecución al trabajar con contenidos de mapas dinámicos.

Pruébalo tú mismo

import 'dart:io';

void main() {
  // Leer el nombre del sistema
  String? systemName = stdin.readLineSync();
  
  // Crear un Map para almacenar nombres de usuario y sus niveles de permiso
  Map<String, String> userDatabase = {};
  
  // Leer datos de usuario hasta "users_done"
  while (true) {
    String? input = stdin.readLineSync();
    if (input == "users_done") {
      break;
    }
    String username = input!;
    String? permission = stdin.readLineSync();
    userDatabase[username] = permission!;
  }
  
  // Leer el nombre de usuario a verificar y el nivel de permiso a validar
  String? usernameToCheck = stdin.readLineSync();
  String? permissionToVerify = stdin.readLineSync();
  
  // TODO: Escribe tu código a continuación
  // Usa containsKey() para verificar si el nombre de usuario existe
  // Usa containsValue() para verificar si el nivel de permiso existe en el sistema
  // Verifica si el usuario específico tiene el permiso específico
  // Determina el estado de acceso y el nivel de seguridad:
  //   - "High (admin access detected)" si se concede el acceso Y el permiso es admin, administrator o staff
  //   - "Medium (standard access)" si se concede el acceso pero el permiso no es de tipo admin
  //   - "Medium (valid user, invalid permission)" si el usuario existe pero tiene el permiso incorrecto
  //   - "Low (user not registered)" si el usuario no existe
  
  // Imprimir el análisis de autenticación
  print("System: $systemName");
  print("User Database: $userDatabase");
  print("Authentication Check:");
  // Agrega tus declaraciones de salida aquí
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Lógica y Flujo