HashMapを構築する
キーで値を挿入し、検索します。
「HashMapを構築する」はCoddyKit上の無料Learn Rust Codingレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn Rust Coding学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn Rust Codingコースには全4レッスンが含まれています。
HashMapとは
HashMapは、キーと値のペアとしてデータを格納します。インデックスではなく、キーを使って値を検索します。
電話帳をイメージしてください。名前(キー)から電話番号(値)を引き出します。意味のあるキーで高速に検索したい場合に、HashMapは最適です。
HashMapをインポートする
VecやStringとは異なり、HashMapはプレリュードに含まれていません。スコープに取り込む必要があります。
ファイルの先頭にuseの行を追加します。これで、モジュール全体から名前を使えるようになります。
use std::collections::HashMap;
fn main() {
let scores: HashMap<String, i32> = HashMap::new();
println!("empty map len: {}", scores.len());
}ペアを挿入する
insertを使ってキーと値を追加します。キーがすでに存在する場合は、古い値が置き換えられます。
挿入できるように、マップはmutとして宣言する必要があります。
use std::collections::HashMap;
fn main() {
let mut scores = HashMap::new();
scores.insert("Alice", 50);
scores.insert("Bob", 30);
println!("{} players", scores.len());
}型推論
型を明示的に書く必要はほとんどありません。Rustは最初のinsert呼び出しから、HashMap<&str, i32>を推論します。
ここでは、キーが文字列スライス、値が整数であることを、使用方法から判断しています。
use std::collections::HashMap;
fn main() {
let mut ages = HashMap::new();
ages.insert("Sam", 28);
ages.insert("Mia", 34);
println!("Sam is {}", ages["Sam"]);
}値を取得する
getメソッドはOptionを返します。キーが存在すればSome(&value)、存在しなければNoneが返されます。
これにより、キーが見つからない場合を安全に処理する必要が生じます。
use std::collections::HashMap;
fn main() {
let mut scores = HashMap::new();
scores.insert("Alice", 50);
match scores.get("Alice") {
Some(v) => println!("score: {}", v),
None => println!("no score"),
}
}インデックス指定とgetの違い
map[key]でインデックス指定もできますが、キーが存在しないとパニックになります。
キーが存在しない可能性がある場合はgetを使ってください。キーが必ず存在すると確信できる場合だけ、インデックス指定を使います。
use std::collections::HashMap;
fn main() {
let mut m = HashMap::new();
m.insert("x", 1);
// m["y"] would panic!
let v = m.get("y").copied().unwrap_or(0);
println!("y = {}", v);
}値を更新する
既存のキーを指定してinsertを呼び出すと、古い値が上書きされます。
以前の値はOptionに包まれて返されるため、必要なら確認できます。
use std::collections::HashMap;
fn main() {
let mut m = HashMap::new();
m.insert("k", 1);
let old = m.insert("k", 9);
println!("old = {:?}, now = {}", old, m["k"]);
}キーを確認する
contains_keyを使うと、値を取得せずにキーの存在を確認できます。
通常のboolを返すため、if条件で便利に使えます。
use std::collections::HashMap;
fn main() {
let mut m = HashMap::new();
m.insert("on", true);
if m.contains_key("on") {
println!("key exists");
}
}エントリを削除する
removeメソッドはキーを削除し、その値をOptionとして返します。
キーが存在しなかった場合はNoneが返されるため、削除処理は常に安全です。
use std::collections::HashMap;
fn main() {
let mut m = HashMap::new();
m.insert("a", 1);
let removed = m.remove("a");
println!("removed {:?}, len {}", removed, m.len());
}マップをイテレートする
HashMapをforループで処理すると、(key, value)タプルが参照として順番に取得されます。
ハッシュによって配置が分散されるため、順序は未指定で、実行するたびに変わる可能性があります。
use std::collections::HashMap;
fn main() {
let mut m = HashMap::new();
m.insert("a", 1);
m.insert("b", 2);
for (k, v) in &m {
println!("{} -> {}", k, v);
}
}キーの所有権
Stringのような所有権を持つ値を挿入すると、マップがその所有権を取得します。
先にクローンしていない限り、挿入後にその変数を再び使うことはできません。
use std::collections::HashMap;
fn main() {
let mut m = HashMap::new();
let name = String::from("Alice");
m.insert(name, 50);
// name is moved here; m owns it now
println!("{}", m["Alice"]);
}理解度チェック
値が必要ですが、キーが存在しない可能性があります。
まとめ
HashMapを作成し、ペアを挿入して、getまたはインデックス指定で値を検索する方法を学びました。
contains_key、remove、イテレーション、そしてマップが挿入されたキーの所有権を取得する仕組みについても学びました。
よくある質問
「HashMapを構築する」レッスンは無料ですか?
はい。「HashMapを構築する」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn Rust Codingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn Rust Codingコースには全4レッスンが含まれています。
「HashMapを構築する」で何を学びますか?
キーで値を挿入し、検索します。 ブラウザで直接実行するハンズオンコードでLearn Rust Codingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Learn Rust Codingを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLearn Rust Codingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「HashMapを構築する」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLearn Rust Codingレッスンでコードを書いて実行できますか?
はい。すべてのLearn Rust Codingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- HashMapを構築する
- Entry APIとデフォルト値
- HashSetを扱う
- カウントとグループ化