Prüfen auf Schlüssel und Werte
Teil des Abschnitts Logik & Ablauf der Dart-Journey von Coddy — Lektion 27 von 65.
Bevor Sie auf Daten in einer Map zugreifen, ist es wichtig zu überprüfen, ob der Schlüssel oder der Wert, nach dem Sie suchen, tatsächlich existiert. Dart bietet hierfür zwei Methoden an: containsKey() und containsValue().
Die Methode containsKey() prüft, ob ein bestimmter Schlüssel in der Map existiert, und gibt true zurück, falls er gefunden wurde, andernfalls false. Dies ist besonders nützlich, bevor versucht wird, auf einen Wert zuzugreifen, und hilft Ihnen dabei, potenzielle Fehler zu vermeiden.
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); // falseEbenso prüft containsValue(), ob ein bestimmter Wert irgendwo in der Map existiert. Diese Methode durchsucht alle Werte und gibt true zurück, wenn sie eine Übereinstimmung findet.
bool hasAdmin = userPermissions.containsValue('admin');
print(hasAdmin); // trueDiese Methoden sind entscheidend für das Schreiben von sicherem Code, der fehlende Daten elegant verarbeitet und so Laufzeitfehler beim Arbeiten mit dynamischen Map-Inhalten verhindert.
Aufgabe
EinfachErstellen Sie ein Programm, das ein Benutzerauthentifizierungssystem verwaltet, indem es Benutzeranmeldedaten verifiziert und Berechtigungsstufen überprüft. Ihr Programm sollte:
- Einen String-Input einlesen, der den Systemnamen darstellt
- Mehrere Paare von Eingaben einlesen, die Benutzernamen und deren Berechtigungsstufen darstellen (die Eingabe endet, wenn Sie
"users_done"erhalten) - Einen String-Input einlesen, der den zu prüfenden Benutzernamen darstellt
- Einen String-Input einlesen, der die zu verifizierende Berechtigungsstufe darstellt
- Eine Map erstellen, um Benutzernamen als Schlüssel und deren Berechtigungsstufen als Werte zu speichern
containsKey()verwenden, um zu prüfen, ob der Benutzername im System existiertcontainsValue()verwenden, um zu prüfen, ob die angegebene Berechtigungsstufe irgendwo im System existiert- Die Authentifizierungsanalyse im unten gezeigten exakten Format ausgeben
Wenn zum Beispiel der Systemname "Corporate Network" ist, die Benutzer "alice" mit "admin", "bob" mit "editor", "charlie" mit "viewer", "diana" mit "admin" umfassen, der zu prüfende Benutzername "alice" ist und die zu verifizierende Berechtigungsstufe "admin" ist, sollte Ihr Programm Folgendes ausgeben:
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)Wenn der Systemname "School Portal" ist, die Benutzer "teacher1" mit "instructor", "student1" mit "student", "admin1" mit "administrator" umfassen, der zu prüfende Benutzername "guest" ist und die zu verifizierende Berechtigungsstufe "student" ist, sollte Ihr Programm Folgendes ausgeben:
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)Wenn der Systemname "Library System" ist, die Benutzer "librarian" mit "staff", "member1" mit "member", "member2" mit "member" umfassen, der zu prüfende Benutzername "librarian" ist und die zu verifizierende Berechtigungsstufe "premium" ist, sollte Ihr Programm Folgendes ausgeben:
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)Ihr Programm muss containsKey() verwenden, um zu verifizieren, ob der Benutzername existiert, und containsValue(), um zu prüfen, ob die Berechtigungsstufe irgendwo im System existiert. Um zu prüfen, ob der spezifische Benutzer die spezifische Berechtigung hat, vergleichen Sie die tatsächliche Berechtigungsstufe des Benutzers mit der angeforderten. Bestimmen Sie die Sicherheitsstufe basierend auf den Ergebnissen: "High", wenn der Zugriff mit Berechtigungen vom Typ Admin gewährt wird (admin, administrator, staff), "Medium", wenn der Benutzer existiert, aber die falschen Berechtigungen hat, und "Low", wenn der Benutzer nicht existiert. Das Eingabeformat ist: Systemname, dann abwechselnd Benutzernamen und Berechtigungsstufen, endend mit "users_done", gefolgt von dem zu prüfenden Benutzernamen und der zu verifizierenden Berechtigungsstufe.
Spickzettel
Verwenden Sie containsKey(), um zu prüfen, ob ein bestimmter Schlüssel in einer Map existiert:
Map<String, String> userPermissions = {
'user123': 'admin',
'user456': 'editor',
'user789': 'viewer'
};
bool hasUser = userPermissions.containsKey('user123');
print(hasUser); // trueVerwenden Sie containsValue(), um zu prüfen, ob ein bestimmter Wert irgendwo in einer Map existiert:
bool hasAdmin = userPermissions.containsValue('admin');
print(hasAdmin); // trueBeide Methoden geben true zurück, wenn der Eintrag gefunden wurde, und andernfalls false, was hilft, Laufzeitfehler beim Arbeiten mit dynamischen Map-Inhalten zu vermeiden.
Probier es selbst
import 'dart:io';
void main() {
// Systemnamen lesen
String? systemName = stdin.readLineSync();
// Erstelle eine Map, um Benutzernamen und deren Berechtigungsstufen zu speichern
Map<String, String> userDatabase = {};
// Benutzerdaten lesen bis "users_done"
while (true) {
String? input = stdin.readLineSync();
if (input == "users_done") {
break;
}
String username = input!;
String? permission = stdin.readLineSync();
userDatabase[username] = permission!;
}
// Zu prüfenden Benutzernamen und zu verifizierende Berechtigungsstufe lesen
String? usernameToCheck = stdin.readLineSync();
String? permissionToVerify = stdin.readLineSync();
// TODO: Schreibe deinen Code unten
// Verwende containsKey(), um zu prüfen, ob der Benutzername existiert
// Verwende containsValue(), um zu prüfen, ob die Berechtigungsstufe im System existiert
// Prüfe, ob der spezifische Benutzer die spezifische Berechtigung hat
// Bestimme den Zugriffsstatus und die Sicherheitsstufe:
// - "High (admin access detected)", wenn Zugriff gewährt UND Berechtigung admin, administrator oder staff ist
// - "Medium (standard access)", wenn Zugriff gewährt, aber Berechtigung kein Admin-Typ ist
// - "Medium (valid user, invalid permission)", wenn Benutzer existiert, aber die falsche Berechtigung hat
// - "Low (user not registered)", wenn Benutzer nicht existiert
// Die Authentifizierungsanalyse ausgeben
print("System: $systemName");
print("User Database: $userDatabase");
print("Authentication Check:");
// Füge hier deine Ausgabeanweisungen hinzu
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Ablauf
1Fortgeschrittene Listenmanipulation
Listen-Eigenschaften: first & lastListen-Status: isEmpty & isNotEmptyEine Liste umkehrenHinzufügen zu einer Liste: insertElemente aus Liste entfernen: removeWhereSuchen in einer Liste: indexOfEine Liste sortierenEine Liste mischenZusammenfassung – Listen-Organizer4Fortgeschrittene Map-Manipulation
Über eine Map iterierenPrüfen auf Schlüssel und WerteMap-Eigenschaften: keys & valuesBedingtes Hinzufügen: putIfAbsentEinträge aus einer Map entfernenVerschachtelte MapsRückblick – Inventar-Update7Fortgeschrittene Funktionen
Anonyme FunktionenFunktionen als Argumente übergebenClosures verstehenEinführung in die RekursionRekursive Funktion: CountdownRekursive Funktion: FakultätZusammenfassung – List Processor10Abschluss-Herausforderungen
Herausforderung: NotensortiererHerausforderung: VokalzählerHerausforderung: FizzBuzz2Funktionale Listenoperationen
Transformieren mit 'map'Filtern mit 'where''.toList()' verwendenBedingungen prüfen mit 'any'Bedingungen mit 'every'Suchen mit 'firstWhere'Zusammenfassung – Datenfilterung3Sets
Was ist ein Set?Ein Set erstellenHinzufügen und Entfernen in SetsPrüfen auf Elemente in einem SetEine Liste in ein Set umwandelnSet-VereinigungSet-SchnittmengeSet-DifferenzRückblick – Einzigartige Gästeliste