キーと値の存在確認
CoddyのDartジャーニー「論理とフロー」セクションの一部 — レッスン 27/65。
Map内のデータにアクセスする前に、探しているキーまたは値が実際に存在することを確認することが不可欠です。Dartはこのために2つのメソッドを提供しています: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() を使用する必要があります。特定のユーザーが特定の権限を持っているかどうかを確認するには、そのユーザーの実際の権限レベルと要求された権限レベルを比較してください。結果に基づいてセキュリティレベルを決定します。管理者タイプの権限(admin、administrator、staff)でアクセスが許可された場合は "High"、ユーザーは存在するが権限が正しくない場合は "Medium"、ユーザーが存在しない場合は "Low" とします。入力形式は、システム名、次にユーザー名と権限レベルの交互の入力("users_done" で終了)、最後に確認するユーザー名と検証する権限レベルの順になります。
チートシート
containsKey() を使用して、特定のキーが Map 内に存在するかどうかを確認します。
Map<String, String> userPermissions = {
'user123': 'admin',
'user456': 'editor',
'user789': 'viewer'
};
bool hasUser = userPermissions.containsKey('user123');
print(hasUser); // truecontainsValue() を使用して、特定の値が 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() を使用する
// 特定のユーザーが特定の権限を持っているか確認する
// アクセスステータスとセキュリティレベルを決定する:
// - アクセスが許可され、かつ権限が admin, administrator, または staff の場合は "High (admin access detected)"
// - アクセスは許可されたが、権限が管理者タイプでない場合は "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リストのソートリストのシャッフルまとめ - リストオーガナイザー