Menu
Coddy logo textTech

ペアの削除

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"),
}

この戻り値によって、削除が成功したかどうかを確認でき、削除された値にアクセスすることもできます。これは、ロギングやクリーンアップ操作に役立ちます。

challenge icon

チャレンジ

簡単

在庫内のアイテム数を示す整数 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]" の形式で表示する
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Logic & Flowのすべてのレッスン