Kiểm tra khóa và giá trị
Thuộc phần Logic và luồng điều khiển trong hành trình Dart của Coddy. Bài học 27 trên 65.
Trước khi truy cập dữ liệu trong Map, bạn cần kiểm tra xem khóa hoặc giá trị mình đang tìm có thực sự tồn tại hay không. Dart cung cấp hai phương thức để làm việc này: containsKey() và containsValue().
Phương thức containsKey() kiểm tra xem một khóa cụ thể có tồn tại trong map hay không, trả về true nếu tìm thấy và false nếu không. Cách này đặc biệt hữu ích trước khi bạn truy cập một giá trị, giúp bạn tránh các lỗi có thể xảy ra.
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); // falseTương tự, containsValue() kiểm tra xem một giá trị cụ thể có tồn tại ở bất kỳ đâu trong từ điển hay không. Phương thức này tìm trong tất cả các giá trị và trả về true nếu tìm thấy giá trị trùng khớp.
bool hasAdmin = userPermissions.containsValue('admin');
print(hasAdmin); // trueCác phương thức này rất quan trọng để viết code an toàn, xử lý dữ liệu bị thiếu một cách phù hợp và ngăn lỗi khi chạy chương trình khi làm việc với nội dung bản đồ luôn thay đổi.
Thử thách
DễTạo một chương trình quản lý hệ thống xác thực người dùng bằng cách xác minh thông tin đăng nhập và kiểm tra cấp quyền. Chương trình cần:
- Đọc một chuỗi đầu vào đại diện cho tên hệ thống
- Đọc nhiều cặp đầu vào đại diện cho tên người dùng và cấp quyền của họ (đầu vào sẽ kết thúc khi bạn nhận được
"users_done") - Đọc một chuỗi đầu vào đại diện cho tên người dùng cần kiểm tra
- Đọc một chuỗi đầu vào đại diện cho cấp quyền cần xác minh
- Tạo một Map để lưu tên người dùng làm khóa và cấp quyền tương ứng làm giá trị
- Dùng
containsKey()để kiểm tra xem tên người dùng có tồn tại trong hệ thống hay không - Dùng
containsValue()để kiểm tra xem cấp quyền được chỉ định có tồn tại ở bất kỳ đâu trong hệ thống hay không - In kết quả phân tích xác thực theo đúng định dạng bên dưới
Ví dụ, nếu tên hệ thống là "Corporate Network", người dùng gồm "alice" với quyền "admin", "bob" với quyền "editor", "charlie" với quyền "viewer", "diana" với quyền "admin", tên người dùng cần kiểm tra là "alice" và cấp quyền cần xác minh là "admin", chương trình của bạn sẽ in ra:
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)Nếu tên hệ thống là "School Portal", người dùng gồm "teacher1" với quyền "instructor", "student1" với quyền "student", "admin1" với quyền "administrator", tên người dùng cần kiểm tra là "guest" và cấp quyền cần xác minh là "student", chương trình của bạn sẽ in ra:
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)Nếu tên hệ thống là "Library System", người dùng gồm "librarian" với quyền "staff", "member1" với quyền "member", "member2" với quyền "member", tên người dùng cần kiểm tra là "librarian" và cấp quyền cần xác minh là "premium", chương trình của bạn sẽ in ra:
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)Chương trình của bạn phải dùng containsKey() để xác minh tên người dùng có tồn tại hay không và dùng containsValue() để kiểm tra cấp quyền có tồn tại ở bất kỳ đâu trong hệ thống hay không. Để kiểm tra người dùng cụ thể có quyền cụ thể hay không, hãy so sánh cấp quyền thực tế của người dùng với cấp quyền được yêu cầu. Xác định cấp độ bảo mật dựa trên kết quả: "High" nếu quyền truy cập được cấp với quyền kiểu quản trị viên (admin, administrator, staff), "Medium" nếu người dùng tồn tại nhưng có quyền không phù hợp, và "Low" nếu người dùng không tồn tại. Định dạng đầu vào sẽ là: tên hệ thống, sau đó là các tên người dùng và cấp quyền xen kẽ, kết thúc bằng "users_done", tiếp theo là tên người dùng cần kiểm tra và cấp quyền cần xác minh.
Tự làm thử
import 'dart:io';
void main() {
// Đọc tên hệ thống
String? systemName = stdin.readLineSync();
// Tạo Map để lưu tên người dùng và cấp quyền tương ứng
Map<String, String> userDatabase = {};
// Đọc dữ liệu người dùng cho đến khi gặp "users_done"
while (true) {
String? input = stdin.readLineSync();
if (input == "users_done") {
break;
}
String username = input!;
String? permission = stdin.readLineSync();
userDatabase[username] = permission!;
}
// Đọc tên người dùng cần kiểm tra và cấp quyền cần xác minh
String? usernameToCheck = stdin.readLineSync();
String? permissionToVerify = stdin.readLineSync();
// TODO: Viết code bên dưới
// Dùng containsKey() để kiểm tra tên người dùng có tồn tại không
// Dùng containsValue() để kiểm tra cấp quyền có tồn tại trong hệ thống không
// Kiểm tra người dùng cụ thể có quyền tương ứng không
// Xác định trạng thái truy cập và mức độ bảo mật:
// - "High (admin access detected)" nếu có quyền truy cập VÀ cấp quyền là admin, administrator, hoặc staff
// - "Medium (standard access)" nếu có quyền truy cập nhưng cấp quyền không thuộc nhóm admin
// - "Medium (valid user, invalid permission)" nếu người dùng tồn tại nhưng có cấp quyền không đúng
// "Low (user not registered)" nếu người dùng không tồn tại
// In ra kết quả phân tích xác thực
print("System: $systemName");
print("User Database: $userDatabase");
print("Authentication Check:");
// Thêm các câu lệnh in kết quả tại đây
}Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Logic và luồng điều khiển
1Thao tác nâng cao với danh sách
Thuộc tính danh sách: đầu và cuốiTrạng thái danh sách: isEmpty và isNotEmpĐảo ngược danh sáchThêm vào danh sách: insertXóa khỏi danh sách: removeWhereTìm trong danh sách: indexOfSắp xếp danh sáchXáo trộn danh sáchÔn tập: trình sắp xếp danh sách4Thao tác nâng cao với Map
Duyệt qua MapKiểm tra khóa và giá trịCác thuộc tính của Map: khóa và giá trịThêm có điều kiện: putIfAbsentXóa mục khỏi MapMap lồng nhauÔn tập: Cập nhật kho hàng2Thao tác hàm trên danh sách
Biến đổi bằng 'map'Lọc bằng 'where'Dùng '.toList()'Kiểm tra điều kiện bằng 'any'Điều kiện với 'every'Tìm phần tử bằng 'firstWhere'Ôn tập: lọc dữ liệu5Dự án: Tính tiền giỏ hàng
Thiết lập dự ánThêm mặt hàng vào giỏ8Dự án: Trình phân tích văn bản đơn giản
Tổng quan và thiết lập dự ánĐếm ký tự3Tập hợp
Tập hợp là gì?Tạo tập hợpThêm và xóa phần tử khỏi tập hợpKiểm tra phần tử trong tập hợpChuyển danh sách thành tập hợpPhép hợp của các tập hợpPhép giao của các tập hợpPhép hiệu của các tập hợpÔn tập: danh sách khách mời không trùng lặpTự luyện tập: Trình biên dịch Dart online