Mapからのエントリの削除
CoddyのDartジャーニー「論理とフロー」セクションの一部 — レッスン 30/65。
Mapでデータを管理する際、不要になったエントリを削除する必要がしばしば生じます。remove()メソッドは、キーを使用してマップからキーと値のペアを削除するための簡単な方法を提供します。
remove()メソッドは、削除したいエントリのキーという1つの引数を取ります。呼び出されると、マップからキーとその関連付けられた値の両方を削除します。キーがマップ内に存在しない場合、このメソッドはエラーを発生させることなく、単に何もしません。
Map<String, double> inventory = {
'Laptop': 999.99,
'Mouse': 25.50,
'Keyboard': 75.00
};
// インベントリからマウスを削除する
inventory.remove('Mouse');
print(inventory); // {Laptop: 999.99, Keyboard: 75.0}
// 存在しないアイテムを削除しようとしても何もしない
inventory.remove('Tablet');
print(inventory); // {Laptop: 999.99, Keyboard: 75.0}このメソッドは、アプリケーション内でクリーンで最新のマップを維持するために不可欠です。在庫管理、ユーザーデータ、またはアイテムを削除する必要があるその他のコレクションを管理している場合でも、remove() は、キーによってエントリを削除するための安全で効率的な方法を提供します。
チャレンジ
簡単楽曲ライブラリを追跡し、ライセンスの問題で利用できなくなった曲を削除することで、デジタル音楽ストリーミングサービスを管理するプログラムを作成してください。プログラムは以下の処理を行う必要があります:
- ストリーミングサービス名を表す文字列入力を読み込む
- 曲のタイトルとその再生回数を表す複数の入力ペアを読み込む(入力は
"library_done"を受け取った時点で終了します) - ライセンスの問題で削除される曲を表す複数の文字列入力を読み込む(入力は
"removal_done"を受け取った時点で終了します) - 曲のタイトルをキー、再生回数を値として格納する Map を作成する
remove()メソッドを使用して、指定された各曲をライブラリから削除する- ライブラリの統計を計算し、以下に示す正確な形式で削除レポートを出力する
例えば、サービス名が "MusicStream Pro" で、ライブラリに "Bohemian Rhapsody"(再生回数 2500000)、"Imagine"(再生回数 1800000)、"Hotel California"(再生回数 2200000)、"Stairway to Heaven"(再生回数 1900000)が含まれており、削除する曲が "Imagine"、"Yesterday"、"Hotel California" の場合、プログラムは以下のように出力する必要があります:
Service: MusicStream Pro
Original Library: {Bohemian Rhapsody: 2500000, Imagine: 1800000, Hotel California: 2200000, Stairway to Heaven: 1900000}
Removal Process:
Removing 'Imagine': Song removed (had 1800000 streams)
Removing 'Yesterday': Song not found in library
Removing 'Hotel California': Song removed (had 2200000 streams)
Updated Library: {Bohemian Rhapsody: 2500000, Stairway to Heaven: 1900000}
Library Statistics:
Songs before removal: 4
Songs after removal: 2
Songs successfully removed: 2
Songs not found: 1
Total streams lost: 4000000
Remaining total streams: 4400000
Status: Library update completedサービス名が "SoundWave" で、ライブラリに "Shape of You"(再生回数 3200000)、"Blinding Lights"(再生回数 2800000)、"Someone Like You"(再生回数 2100000)が含まれており、削除する曲が "Blinding Lights"、"Perfect" の場合、プログラムは以下のように出力する必要があります:
Service: SoundWave
Original Library: {Shape of You: 3200000, Blinding Lights: 2800000, Someone Like You: 2100000}
Removal Process:
Removing 'Blinding Lights': Song removed (had 2800000 streams)
Removing 'Perfect': Song not found in library
Updated Library: {Shape of You: 3200000, Someone Like You: 2100000}
Library Statistics:
Songs before removal: 3
Songs after removal: 2
Songs successfully removed: 1
Songs not found: 1
Total streams lost: 2800000
Remaining total streams: 5300000
Status: Library update completedサービス名が "AudioHub" で、ライブラリに "Bad Guy"(再生回数 1500000)、"Watermelon Sugar"(再生回数 1700000)、"Levitating"(再生回数 1400000)、"Good 4 U"(再生回数 1600000)が含まれており、削除する曲が "Bad Guy"、"Levitating"、"Good 4 U"、"Drivers License" の場合、プログラムは以下のように出力する必要があります:
Service: AudioHub
Original Library: {Bad Guy: 1500000, Watermelon Sugar: 1700000, Levitating: 1400000, Good 4 U: 1600000}
Removal Process:
Removing 'Bad Guy': Song removed (had 1500000 streams)
Removing 'Levitating': Song removed (had 1400000 streams)
Removing 'Good 4 U': Song removed (had 1600000 streams)
Removing 'Drivers License': Song not found in library
Updated Library: {Watermelon Sugar: 1700000}
Library Statistics:
Songs before removal: 4
Songs after removal: 1
Songs successfully removed: 3
Songs not found: 1
Total streams lost: 4500000
Remaining total streams: 1700000
Status: Library update completedプログラムでは、Map から曲を削除するために remove() メソッドを使用する必要があります。どの曲が正常に削除され、どの曲が見つからなかったかを追跡してください。正常に削除された曲の再生回数を合計して、失われた総再生回数を計算します。入力形式は、サービス名、次に曲のタイトルと再生回数(整数に変換する必要がある文字列として)が交互に続き、"library_done" で終了し、その後に削除する曲のタイトルが続き、"removal_done" で終了します。
チートシート
remove()メソッドは、キーを使用してMapからキーと値のペアを削除します:
Map<String, double> inventory = {
'Laptop': 999.99,
'Mouse': 25.50,
'Keyboard': 75.00
};
// キーによってエントリを削除する
inventory.remove('Mouse');
print(inventory); // {Laptop: 999.99, Keyboard: 75.0}
// 存在しないキーを削除しても何も起こりません
inventory.remove('Tablet');
print(inventory); // {Laptop: 999.99, Keyboard: 75.0}このメソッドは、エラーを発生させることなく、存在しないキーを安全に処理します。
自分で試してみよう
import 'dart:io';
void main() {
// サービス名を読み込む
String? serviceName = stdin.readLineSync();
// 曲名と再生回数を保存するためのMapを作成する
Map<String, int> songLibrary = {};
// ライブラリのデータを読み込む
while (true) {
String? input = stdin.readLineSync();
if (input == "library_done") break;
String songTitle = input!;
String? streamCountStr = stdin.readLineSync();
int streamCount = int.parse(streamCountStr!);
songLibrary[songTitle] = streamCount;
}
// 削除する曲を読み込む
List<String> songsToRemove = [];
while (true) {
String? input = stdin.readLineSync();
if (input == "removal_done") break;
songsToRemove.add(input!);
}
// TODO: 以下にコードを記述してください
// remove() メソッドを使用して曲の削除処理を行う
// 統計を追跡し、必要な出力形式を生成する
// 結果を必要な形式で出力する
// 次の内容を含めること:サービス名、元のライブラリ、削除プロセス、
// 更新されたライブラリ、およびライブラリの統計
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理とフローのすべてのレッスン
1リスト操作の応用
リストのプロパティ: first と lastリストの状態: isEmpty と isNotEmptyリストの反転リストへの追加: insertリストの削除: removeWhereリスト内の検索: indexOfリストのソートリストのシャッフルまとめ - リストオーガナイザー4Mapの高度な操作
Mapの反復処理キーと値の存在確認Mapのプロパティ: keys と values条件付き追加: putIfAbsentMapからのエントリの削除ネストされたMap復習 - 在庫の更新