HashMap::new() / insert() / get()
| 対応: | Rust 1.0(2015) |
|---|
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("狡噛慎也".to_string(), 90);
map.insert("常守朱".to_string(), 85);
// キーを指定して値を取得します(Option<&V>を返します)。
let val = map.get("狡噛慎也"); // Some(&90)
let val = map.get("xxx"); // None
// インデックス演算子でも取得できます(キーが存在しない場合はパニック)。
let val = &map["狡噛慎也"]; // &90
メソッド一覧
| メソッド | 概要 |
|---|---|
| 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() | 全てのエントリを削除します。 |
サンプルコード
sample_hashmap_new_insert_get.rs
use std::collections::HashMap;
fn main() {
// HashMap を生成して要素を追加します。
let mut scores: HashMap<String, i32> = HashMap::new();
scores.insert("狡噛慎也".to_string(), 90);
scores.insert("常守朱".to_string(), 85);
scores.insert("宜野座伸元".to_string(), 92);
println!("scores: {:?}", scores);
println!("len: {}", scores.len());
// get() で値を取得します(Option型で返ります)。
match scores.get("狡噛慎也") {
Some(score) => println!("狡噛慎也のスコア: {}", score),
None => println!("狡噛慎也は見つかりません"),
}
// if let でスッキリ書けます。
if let Some(score) = scores.get("常守朱") {
println!("常守朱のスコア: {}", score);
}
// get() が None の場合の処理です。
let masaoka = scores.get("征陸智己");
println!("征陸智己のスコア: {:?}", masaoka); // None
// unwrap_or() でデフォルト値を設定します。
let score = scores.get("征陸智己").unwrap_or(&0);
println!("征陸智己のスコア(デフォルト0): {}", score);
// get_mut() で値を変更します。
if let Some(score) = scores.get_mut("狡噛慎也") {
*score += 5; // 90 → 95
}
println!("狡噛慎也更新後: {:?}", scores.get("狡噛慎也"));
// insert() は旧値を返します。
let old = scores.insert("常守朱".to_string(), 100);
println!("常守朱の旧スコア: {:?}", 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);
// PSYCHO-PASSキャラと担当BGMのHashMapです。
let bgm_map: HashMap<String, String> = vec![
("狡噛慎也".to_string(), "abnormalize".to_string()),
("常守朱".to_string(), "Enigmatic Feeling".to_string()),
("宜野座伸元".to_string(), "Out of Control".to_string()),
].into_iter().collect();
println!("狡噛慎也のBGM: {:?}", bgm_map.get("狡噛慎也"));
}
rustc hashmap_new_insert_get.rs
./hashmap_new_insert_get
scores: {"狡噛慎也": 90, "常守朱": 85, "宜野座伸元": 92}
len: 3
狡噛慎也のスコア: 90
常守朱のスコア: 85
征陸智己のスコア: None
征陸智己のスコア(デフォルト0): 0
狡噛慎也更新後: Some(95)
常守朱の旧スコア: Some(85)
team_map: {"Japan": 3, "USA": 5, "Germany": 2}
狡噛慎也のBGM: Some("abnormalize")
概要
HashMapは順序を保証しないため、同じMapでも出力順序が変わることがあります。順序を保ちたい場合はBTreeMapを使います。
Rustでは文字列キーに『&str』を渡すと『String』キーのHashMapでも検索できます(Borrow trait の仕組みにより)。そのため『map.get("狡噛慎也")』のように文字列リテラルで検索できます。
インデックス演算子(map["key"])はキーが存在しない場合パニックします。安全に取得するには必ず『get()』を使い、Optionで受け取ってください。
キーの存在確認・削除・entry APIは『HashMap::contains_key() / remove() / entry()』を、イテレーションは『HashMap::keys() / values() / iter()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。