ハッシュマップの反復処理
CoddyのRustジャーニー「論理とフロー」セクションの一部。レッスン 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つあります:ハッシュマップは特定の反復順序を保証しません。プログラムを実行するたびに、pairs が異なる順序で出力される可能性があります。これは、ハッシュマップが挿入順序の維持よりも高速な検索を優先するためです。そのため、反復処理を行う際に、項目が特定の順序で現れることを当てにしないでください。
チャレンジ
簡単処理する student-score pairs の数を示す整数 n を受け取ります。次に、n 個の inputs の pairs を受け取ります。それぞれは student name、その後にテストの score(整数)が続く形式です。student names を keys として、scores を values として格納する hash map を Create します。すべての pairs を insert した後、hash map を Iterate し、各 student の name と score を print します。
要件:
HashMapをstd::collectionsから Import する- 型
HashMap<String, i32>の mutable な hash map を Create する - 最初の input を Read し、
i32に変換して pairs の数を取得する - loop を使用して、
n個の inputs の pairs(student name、次に score)を Read する - 各 student name と score を hash map に insert する
forloop と&mapを使用して hash map を Iterate する- 各 student の information を次の形式で print する:
[name]: [score] - pairs は任意の順序で print する(hash maps では順序が保証されない)
Input:
- 1 行目: 整数
n(例:3) - 次の
n組の行: - Student name(例:
Alice) - 整数としての Test score(例:
95)
Output:
- 各 student について、次の形式で 1 行:
[name]: [score] - Output の行の順序は、テストの実行ごとに異なる場合がある
自分で試してみよう
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: ハッシュマップを反復処理し、各学生の名前とスコアを出力する
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理とフローのすべてのレッスン
自分で練習してみよう: Rustオンラインコンパイラ