Проверка ключей и значений
Часть раздела Логика и управление потоком путешествия по 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Эти методы имеют решающее значение для написания безопасного кода, который корректно обрабатывает отсутствие данных, предотвращая ошибки во время выполнения при работе с динамическим содержимым карт.
Задание
ЛегкоСоздайте программу, которая управляет системой аутентификации пользователей, проверяя учетные данные пользователей и уровни разрешений. Ваша программа должна:
- Считать строковый ввод, представляющий название системы
- Считать несколько пар входных данных, представляющих имена пользователей и их уровни разрешений (ввод закончится, когда вы получите
"users_done") - Считать строковый ввод, представляющий имя пользователя для проверки
- Считать строковый ввод, представляющий уровень разрешений для верификации
- Создать Map для хранения имен пользователей в качестве ключей и их уровней разрешений в качестве значений
- Использовать
containsKey(), чтобы проверить, существует ли имя пользователя в системе - Использовать
containsValue(), чтобы проверить, существует ли указанный уровень разрешений где-либо в системе - Вывести анализ аутентификации в точном формате, показанном ниже
Например, если название системы — "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:");
// Добавьте ваши операторы вывода здесь
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутая работа со списками
Свойства списка: first и lastСостояние списка: isEmpty и isNotEmptyРазворот спискаДобавление в список: insertУдаление из списка: removeWhereПоиск в списке: indexOfСортировка спискаПеремешивание спискаИтоги — Органайзер списков4Продвинутая работа с Map
Итерация по MapПроверка ключей и значенийСвойства Map: keys и valuesУсловное добавление: putIfAbsentУдаление записей из MapВложенные MapИтоги — Обновление инвентаря2Функциональные операции со списками
Преобразование с помощью 'map'Фильтрация с помощью 'where'Использование '.toList()'Проверка условий с помощью 'any'Условия с 'every'Поиск с помощью 'firstWhere'Повторение — фильтрация данных5Проект: Калькулятор корзины
Настройка проектаДобавление товаров в корзину3Множества
Что такое множество?Создание множестваДобавление и удаление элементовПроверка наличия элементов в множествеПреобразование списка в множествоОбъединение множествПересечение множествРазность множествИтоги: уникальный список гостей