ペアの削除
CoddyのRustジャーニー「Logic & Flow」セクションの一部 — レッスン 33/66。
時には、ハッシュマップからデータを完全に削除する必要がある場合があります。Rustは、キーを指定することでキーと値のペアを削除するための .remove() メソッドを提供しています。
let mut inventory = HashMap::new();
inventory.insert("apples", 50);
inventory.insert("bananas", 30);
// "apples" のエントリを完全に削除します
inventory.remove("apples");.remove() メソッドは、キーをパラメータとして受け取り、ハッシュマップからキーとその関連付けられた値の両方を削除します。.remove("apples") を呼び出した後、"apples" を検索しようとすると None が返されます。
多くのハッシュマップ操作と同様に、.remove() は Option を返します。キーが存在した場合は削除された値を含む Some(value) を返し、キーが見つからなかった場合は None を返します:
let removed_value = inventory.remove("bananas");
match removed_value {
Some(count) => println!("Removed {} bananas", count),
None => println!("No bananas found to remove"),
}この戻り値によって、削除が成功したかどうかを確認でき、削除された値にアクセスすることもできます。これは、ロギングやクリーンアップ操作に役立ちます。
チャレンジ
簡単在庫内のアイテム数を示す整数 n を受け取ります。次に、アイテム名とその数量(整数)のペアを n 組受け取ります。その後、在庫から削除するアイテム名をさらにもう1つ受け取ります。在庫を保存するためのハッシュマップを作成し、すべてのアイテムを挿入し、指定されたアイテムを削除して、削除結果と残りの在庫を出力してください。
要件:
std::collectionsからHashMapをインポートする- 型が
HashMap<String, i32>の可変(mutable)なハッシュマップを作成する - 最初の入力を読み取り、
i32に変換してアイテム数を取得する - ループを使用して
n組の入力(アイテム名、次に数量)を読み取る - 各アイテムとその数量をハッシュマップに挿入する
- 削除するアイテム名として、さらにもう1つの入力を読み取る
.remove()を使用してハッシュマップからアイテムを削除するmatchを使用して.remove()から返されるOptionを処理する- アイテムが見つかって削除された場合は、
Removed [quantity] [item_name]と出力する - アイテムが見つからなかった場合は、
[item_name] not foundと出力する - 削除処理の後、残りのハッシュマップを反復処理し、各アイテムを
[item_name]: [quantity]の形式で出力する
入力:
- 1行目: 整数
n(例:3) - 続く
n組の行:- アイテム名 (例:
apples) - 整数としての数量 (例:
50)
- アイテム名 (例:
- 最後の行: 削除するアイテム名 (例:
bananas)
出力:
- 1行目:
Removed [quantity] [item_name]または[item_name] not foundのいずれか - 続く行: 残りの各アイテムについて、
[item_name]: [quantity]の形式で1行ずつ出力 - 残りのアイテムの順序は、テスト実行ごとに異なる場合があります
チートシート
ハッシュマップからキーと値のペアを削除するには、キーを引数として .remove() メソッドを使用します:
let mut inventory = HashMap::new();
inventory.insert("apples", 50);
inventory.insert("bananas", 30);
inventory.remove("apples");.remove() メソッドは Option を返します。キーが存在した場合は Some(value)、見つからなかった場合は None が返されます:
let removed_value = inventory.remove("bananas");
match removed_value {
Some(count) => println!("Removed {} bananas", count),
None => println!("No bananas found to remove"),
}自分で試してみよう
use std::collections::HashMap;
use std::io::{self, BufRead};
fn main() {
let stdin = io::stdin();
let mut lines = stdin.lock().lines();
// アイテムの数を読み込む
let n: i32 = lines.next().unwrap().unwrap().trim().parse().unwrap();
// 在庫を保存するための可変ハッシュマップを作成する
let mut inventory: HashMap<String, i32> = HashMap::new();
// n組の入力(アイテム名と数量)を読み込む
for _ in 0..n {
let item_name = lines.next().unwrap().unwrap().trim().to_string();
let quantity: i32 = lines.next().unwrap().unwrap().trim().parse().unwrap();
// TODO: アイテムと数量をハッシュマップに挿入する
}
// 削除するアイテム名を読み込む
let item_to_remove = lines.next().unwrap().unwrap().trim().to_string();
// TODO: ハッシュマップからアイテムを削除し、matchを使用して結果を処理する
// 削除結果を表示する("Removed [quantity] [item_name]" または "[item_name] not found" のいずれか)
// TODO: 残りの在庫を反復処理し、各アイテムを "[item_name]: [quantity]" の形式で表示する
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。