Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
HashMap::new() / insert() / get()
RustのHashMapはキーと値のペアを格納するコレクションです。『HashMap::new()』で生成し、『insert()』でエントリを追加、『get()』で値を取得します。使用するには『use std::collections::HashMap;』が必要です。
構文
use std::collections::HashMap;
// 空のHashMapを生成します。
let mut map: HashMap<String, i32> = HashMap::new();
// キーと値を追加します(同じキーが存在する場合は上書きします)。
map.insert("apple".to_string(), 100);
map.insert("banana".to_string(), 200);
// キーを指定して値を取得します(Option<&V>を返します)。
let val = map.get("apple"); // Some(&100)
let val = map.get("xxx"); // None
// インデックス演算子でも取得できます(キーが存在しない場合はパニック)。
let val = &map["apple"]; // &100
メソッド一覧
| メソッド | 概要 |
|---|---|
| HashMap::new() | 空のHashMapを生成します。 |
| HashMap::with_capacity(n) | n要素分のメモリを事前確保してHashMapを生成します。 |
| map.insert(key, value) | キーと値を追加します。既存キーの場合は旧値をSomeで返します。 |
| map.get(&key) | キーに対応する値をOption<&V>で返します。 |
| map.get_mut(&key) | キーに対応する値をOption<&mut V>で返します(変更可能)。 |
| map[&key] | キーに対応する値の参照を返します(存在しない場合はパニック)。 |
| map.len() | エントリ数を返します。 |
| map.is_empty() | HashMapが空かどうかを返します。 |
| map.clear() | 全てのエントリを削除します。 |
サンプルコード
use std::collections::HashMap;
fn main() {
// HashMap を生成して要素を追加します。
let mut scores: HashMap<String, i32> = HashMap::new();
scores.insert("Alice".to_string(), 90);
scores.insert("Bob".to_string(), 85);
scores.insert("Carol".to_string(), 92);
println!("scores: {:?}", scores);
println!("len: {}", scores.len());
// get() で値を取得します(Option型で返ります)。
match scores.get("Alice") {
Some(score) => println!("Aliceのスコア: {}", score),
None => println!("Aliceは見つかりません"),
}
// if let でスッキリ書けます。
if let Some(score) = scores.get("Bob") {
println!("Bobのスコア: {}", score);
}
// get() が None の場合の処理です。
let dave = scores.get("Dave");
println!("Daveのスコア: {:?}", dave); // None
// unwrap_or() でデフォルト値を設定します。
let score = scores.get("Dave").unwrap_or(&0);
println!("Daveのスコア(デフォルト0): {}", score);
// get_mut() で値を変更します。
if let Some(score) = scores.get_mut("Alice") {
*score += 5; // 90 → 95
}
println!("Alice更新後: {:?}", scores.get("Alice"));
// insert() は旧値を返します。
let old = scores.insert("Bob".to_string(), 100);
println!("Bobの旧スコア: {:?}", old); // Some(85)
// イテラブルからHashMapを生成します。
let teams = vec![
("Japan".to_string(), 3),
("USA".to_string(), 5),
("Germany".to_string(), 2),
];
let team_map: HashMap<String, i32> = teams.into_iter().collect();
println!("team_map: {:?}", team_map);
}
概要
HashMapは順序を保証しないため、同じMapでも出力順序が変わることがあります。順序を保ちたい場合はBTreeMapを使います。
Rustでは文字列キーに『&str』を渡すと『String』キーのHashMapでも検索できます(Borrow trait の仕組みにより)。そのため『map.get("Alice")』のように文字列リテラルで検索できます。
インデックス演算子(map["key"])はキーが存在しない場合パニックします。安全に取得するには必ず『get()』を使い、Optionで受け取ってください。
キーの存在確認・削除・entry APIは『HashMap::contains_key() / remove() / entry()』を、イテレーションは『HashMap::keys() / values() / iter()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。