HashMap
は、Rustでデータを効率的に格納および検索するための非常に便利なコレクション型です。このデータ構造は、キーと値のペアを格納し、キーを使って対応する値を高速に検索することができます。Rustの標準ライブラリに含まれているHashMap
は、ハッシュ関数を利用してキーを内部で管理し、効率的なアクセスを提供します。
1. HashMap
の基本
RustでのHashMap
の基本的な使用方法を理解するために、まずは必要なライブラリをインポートする必要があります。HashMap
はstd::collections
モジュールに含まれているため、コードの最初に次のようにインポートします。

rustuse std::collections::HashMap;
次に、HashMap
を作成し、キーと値のペアを格納してみましょう。
rustfn main() {
// 空のHashMapを作成
let mut map = HashMap::new();
// 値の挿入
map.insert("key1", 10);
map.insert("key2", 20);
// 値の取得
let value = map.get("key1");
match value {
Some(v) => println!("key1の値は: {}", v),
None => println!("key1は存在しません"),
}
}
上記のコードでは、HashMap
に2つのキーと値のペア("key1"
-> 10、"key2"
-> 20)を挿入しています。map.get()
メソッドを使用して、key1
の値を取得し、存在すればその値を表示し、存在しなければメッセージを表示します。
2. HashMap
の型
HashMap
のキーと値の型は任意の型にすることができますが、重要なのは、キー型がHash
トレイトを実装している必要があることです。Rustでは、標準ライブラリの多くの型がHash
トレイトを実装しており、例えば文字列(String
)や整数型(i32
)が使用できます。
rustuse std::collections::HashMap;
fn main() {
let mut map = HashMap::new();
// i32型のキーとString型の値を挿入
map.insert(1, "one".to_string());
map.insert(2, "two".to_string());
let value = map.get(&1);
match value {
Some(v) => println!("1の値は: {}", v),
None => println!("1は存在しません"),
}
}
この例では、キーにi32
型、値にString
型を使用しています。HashMap
はその柔軟性によって、あらゆるデータ構造に適用可能です。
3. HashMap
の主な操作
挿入(insert
)
insert
メソッドを使用して、キーと値のペアを追加します。もし指定したキーがすでに存在していれば、その値は新しい値で上書きされます。
rustlet mut map = HashMap::new();
map.insert("apple", 5);
map.insert("banana", 2);
map.insert("apple", 10); // "apple"の値が10に上書きされる
取得(get
)
get
メソッドは、指定されたキーに対応する値を取得します。もしキーが存在しない場合、None
が返されます。
rustlet value = map.get("apple");
println!("{:?}", value); // Some(10)
削除(remove
)
remove
メソッドを使用して、指定したキーとその値を削除することができます。
rustmap.remove("banana"); // "banana"とその値を削除
更新(entry
)
entry
メソッドを使用すると、指定したキーが存在するかどうかを確認して、値を更新することができます。もしキーが存在しなければ、新しいキーと値を挿入します。
rustmap.entry("cherry").or_insert(15); // "cherry"が存在しないので、15を挿入
map.entry("apple").or_insert(20); // "apple"はすでに存在するので、値は変更されない
4. HashMap
の反復処理
HashMap
のすべてのキーと値を反復処理することもできます。iter()
メソッドを使用して、HashMap
の各要素を反復できます。
rustfor (key, value) in &map {
println!("キー: {}, 値: {}", key, value);
}
5. HashMap
の特徴と注意点
- 効率的な検索:
HashMap
は平均的にO(1)の時間で要素の挿入、検索、削除を行います。これにより、大量のデータを扱う場合でも高速に動作します。 - 順序なし:
HashMap
はキーの挿入順序を保持しません。要素の順序が重要な場合は、BTreeMap
を使用することを検討してください。 - キーの一意性:
HashMap
のキーは一意でなければなりません。同じキーを複数回挿入すると、後の挿入が前の挿入を上書きします。
6. HashMap
とHashSet
の違い
HashMap
はキーと値のペアを格納しますが、HashSet
は値のみを格納する集合型です。HashSet
のキーはユニークで、重複する値を許容しません。
rustuse std::collections::HashSet;
let mut set = HashSet::new();
set.insert(1);
set.insert(2);
set.insert(1); // 1は既に存在するので、追加されない
7. 結論
HashMap
は、Rustにおける強力なデータ構造で、効率的なデータ格納とアクセスを提供します。キーと値のペアを使用して高速な検索、挿入、削除を実現するため、多くの場面で非常に便利です。その柔軟性を活かして、さまざまなデータ型をキーや値として使用できるため、開発者にとって重要なツールとなります。