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); // falseDel 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); // trueEstos 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.
Desafío
FácilCrea 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:
- Leer una entrada de cadena que represente el nombre del sistema
- Leer múltiples pares de entradas que representen nombres de usuario y sus niveles de permiso (la entrada terminará cuando recibas
"users_done") - Leer una entrada de cadena que represente el nombre de usuario a verificar
- Leer una entrada de cadena que represente el nivel de permiso a verificar
- Crear un Map para almacenar los nombres de usuario como claves y sus niveles de permiso como valores
- Usar
containsKey()para comprobar si el nombre de usuario existe en el sistema - Usar
containsValue()para comprobar si el nivel de permiso especificado existe en cualquier parte del sistema - 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); // trueUsa containsValue() para comprobar si un valor específico existe en cualquier lugar de un Map:
bool hasAdmin = userPermissions.containsValue('admin');
print(hasAdmin); // trueAmbos 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í
}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
1Manipulación avanzada de listas
Propiedades de listas: first y lastEstado de la lista: isEmpty y isNotEmptyInvertir una listaAñadir a una lista: insertEliminación en listas: removeWhereBúsqueda en una lista: indexOfOrdenar una listaMezclar una listaResumen - Organizador de listas4Manipulación avanzada de mapas
Iterar sobre un mapaComprobación de claves y valoresPropiedades del mapa: keys y valuesAdición condicional: putIfAbsentEliminar entradas de un mapaMapas anidadosResumen - Actualización de inventario2Operaciones funcionales con listas
Transformar con 'map'Filtrar con 'where'Uso de '.toList()'Comprobar condiciones con 'any'Condiciones con 'every'Búsqueda con 'firstWhere'Resumen - Filtrado de datos5Proyecto: Calculadora de carrito de compras
Configuración del proyectoAgregar artículos al carrito3Conjuntos
¿Qué es un Conjunto?Crear un ConjuntoAñadir y eliminar elementos de un ConjuntoComprobar elementos en un ConjuntoConvertir una lista en un ConjuntoUnión de ConjuntosIntersección de ConjuntosDiferencia de ConjuntosResumen - Lista de invitados única