Menu
Coddy logo textTech

Проверка ключей и значений

Часть раздела Логика и управление потоком путешествия по Dart на Coddy — урок 27 из 65.

Перед доступом к данным в Map, важно убедиться, что ключ или значение, которые вы ищете, действительно существуют. Dart предоставляет для этого два метода: containsKey() и containsValue().

Метод containsKey() проверяет, существует ли определенный ключ в карте, возвращая true, если он найден, и false в противном случае. Это особенно полезно перед попыткой доступа к значению, помогая избежать потенциальных ошибок.

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

Аналогично, containsValue() проверяет, существует ли определенное значение где-либо в карте. Этот метод выполняет поиск по всем значениям и возвращает true, если находит совпадение.

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

Эти методы имеют решающее значение для написания безопасного кода, который корректно обрабатывает отсутствие данных, предотвращая ошибки во время выполнения при работе с динамическим содержимым карт.

challenge icon

Задание

Легко

Создайте программу, которая управляет системой аутентификации пользователей, проверяя учетные данные пользователей и уровни разрешений. Ваша программа должна:

  1. Считать строковый ввод, представляющий название системы
  2. Считать несколько пар входных данных, представляющих имена пользователей и их уровни разрешений (ввод закончится, когда вы получите "users_done")
  3. Считать строковый ввод, представляющий имя пользователя для проверки
  4. Считать строковый ввод, представляющий уровень разрешений для верификации
  5. Создать Map для хранения имен пользователей в качестве ключей и их уровней разрешений в качестве значений
  6. Использовать containsKey(), чтобы проверить, существует ли имя пользователя в системе
  7. Использовать containsValue(), чтобы проверить, существует ли указанный уровень разрешений где-либо в системе
  8. Вывести анализ аутентификации в точном формате, показанном ниже

Например, если название системы — "Corporate Network", пользователи включают "alice" с "admin", "bob" с "editor", "charlie" с "viewer", "diana" с "admin", имя пользователя для проверки — "alice", а уровень разрешений для верификации — "admin", ваша программа должна вывести:

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)

Если название системы — "School Portal", пользователи включают "teacher1" с "instructor", "student1" с "student", "admin1" с "administrator", имя пользователя для проверки — "guest", а уровень разрешений для верификации — "student", ваша программа должна вывести:

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)

Если название системы — "Library System", пользователи включают "librarian" с "staff", "member1" с "member", "member2" с "member", имя пользователя для проверки — "librarian", а уровень разрешений для верификации — "premium", ваша программа должна вывести:

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)

Ваша программа должна использовать containsKey() для проверки существования имени пользователя и containsValue() для проверки существования уровня разрешений где-либо в системе. Чтобы проверить, есть ли у конкретного пользователя конкретное разрешение, сравните фактический уровень разрешений пользователя с запрошенным. Определите уровень безопасности на основе результатов: "High", если доступ предоставлен с разрешениями типа admin (admin, administrator, staff), "Medium", если пользователь существует, но имеет неправильные разрешения, и "Low", если пользователь не существует. Формат ввода будет следующим: название системы, затем чередующиеся имена пользователей и уровни разрешений, заканчивающиеся на "users_done", после чего следует имя пользователя для проверки и уровень разрешений для верификации.

Шпаргалка

Используйте containsKey(), чтобы проверить, существует ли определенный ключ в Map:

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

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

Используйте containsValue(), чтобы проверить, существует ли определенное значение где-либо в Map:

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

Оба метода возвращают true, если элемент найден, и false в противном случае, что помогает предотвратить ошибки во время выполнения при работе с динамическим содержимым Map.

Попробуйте сами

import 'dart:io';

void main() {
  // Читаем название системы
  String? systemName = stdin.readLineSync();
  
  // Создаем Map для хранения имен пользователей и их уровней доступа
  Map<String, String> userDatabase = {};
  
  // Читаем данные пользователей до тех пор, пока не встретим "users_done"
  while (true) {
    String? input = stdin.readLineSync();
    if (input == "users_done") {
      break;
    }
    String username = input!;
    String? permission = stdin.readLineSync();
    userDatabase[username] = permission!;
  }
  
  // Читаем имя пользователя для проверки и уровень доступа для верификации
  String? usernameToCheck = stdin.readLineSync();
  String? permissionToVerify = stdin.readLineSync();
  
  // TODO: Напишите ваш код ниже
  // Используйте containsKey(), чтобы проверить, существует ли пользователь
  // Используйте containsValue(), чтобы проверить, существует ли уровень доступа в системе
  // Проверьте, есть ли у конкретного пользователя конкретное разрешение
  // Определите статус доступа и уровень безопасности:
  //   - "High (admin access detected)", если доступ разрешен И разрешение: admin, administrator или staff
  //   - "Medium (standard access)", если доступ разрешен, но разрешение не административного типа
  //   - "Medium (valid user, invalid permission)", если пользователь существует, но имеет другое разрешение
  //   - "Low (user not registered)", если пользователь не существует
  
  // Выводим анализ аутентификации
  print("System: $systemName");
  print("User Database: $userDatabase");
  print("Authentication Check:");
  // Добавьте ваши операторы вывода здесь
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком