Menu
Coddy logo textTech

ハッシュマップの反復処理

CoddyのRustジャーニー「Logic & Flow」セクションの一部 — レッスン 31/66。

特定のキーを検索するのではなく、ハッシュマップ内のすべてのキーと値のペアを調べたい場合があります。Rustは、forループを使用してすべてのデータをループ処理する簡単な方法を提供しています:

for (key, value) in &my_map {
    println!("{}: {}", key, value);
}

my_map の前にある & に注目してください。これはハッシュマップへの参照を作成するため、所有権を取得せずに反復処理を行うことができます。このループでは、各キーと値のペアがタプルとして提供されるため、ループ宣言の中で直接デストラクト(構造分解)することができます。

価格リストを使用した実用的な例を以下に示します:

let mut prices = HashMap::new();
prices.insert("apple", 1.20);
prices.insert("banana", 0.80);

for (item, price) in &prices {
    println!("{} costs ${:.2}", item, price);
}

覚えておくべき重要な詳細が1つあります:ハッシュマップは特定の反復順序を保証しません。プログラムを実行するたびに、ペアが異なる順序で出力される可能性があります。これは、ハッシュマップが挿入順序の維持よりも高速なルックアップを優先するためです。したがって、反復処理を行う際に、項目が特定の順序で表示されることに依存しないでください。

challenge icon

チャレンジ

簡単

処理する生徒とスコアのペアの数を示す整数 n を受け取ります。次に、生徒の名前とそのテストスコア(整数)の n ペアの入力を受け取ります。生徒の名前をキー、スコアを値として保存するハッシュマップを作成してください。すべてのペアを挿入した後、ハッシュマップを反復処理し、各生徒の名前とスコアを出力してください。

要件:

  • std::collections から HashMap をインポートする
  • 型が HashMap<String, i32> の可変ハッシュマップを作成する
  • 最初の入力を読み取り、それを i32 に変換してペアの数を取得する
  • ループを使用して n ペアの入力(生徒の名前、次にスコア)を読み取る
  • 各生徒の名前とスコアをハッシュマップに挿入する
  • for ループを使用して &map でハッシュマップを反復処理する
  • 各生徒の情報を [name]: [score] の形式で出力する
  • ペアを任意の順序で出力する(ハッシュマップは順序を保証しません)

入力:

  • 1行目: 整数 n (例: 3)
  • 続く n ペアの行:
    • 生徒の名前 (例: Alice)
    • 整数のテストスコア (例: 95)

出力:

  • 各生徒につき1行、[name]: [score] の形式で出力
  • 出力行の順序はテスト実行ごとに異なる場合があります

チートシート

ハッシュマップ内のすべてのキーと値のペアを反復処理するには、マップへの参照を使用して for ループを使用します:

for (key, value) in &my_map {
    println!("{}: {}", key, value);
}

ハッシュマップの前の & は参照を作成し、所有権を取得せずに反復処理を可能にします。ループは各キーと値のペアをタプルとしてデストラクト(構造分解)します。

ハッシュマップを使用した例:

let mut prices = HashMap::new();
prices.insert("apple", 1.20);
prices.insert("banana", 0.80);

for (item, price) in &prices {
    println!("{} costs ${:.2}", item, price);
}

重要: ハッシュマップは特定の反復順序を保証しません。ハッシュマップは挿入順序の維持よりも高速なルックアップを優先するため、プログラムを実行するたびにペアが異なる順序で表示される場合があります。

自分で試してみよう

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 students: HashMap<String, i32> = HashMap::new();
    
    // TODO: 以下にコードを記述してください
    // nペアの入力(学生の名前とスコア)を読み込み、ハッシュマップに挿入する
    
    
    
    // TODO: ハッシュマップを反復処理し、各学生の名前とスコアを出力する
    
}
quiz icon腕試し

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

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