0Pricing
Learn Rust Coding · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. HashMapを構築する
  2. Entry APIとデフォルト値
  3. HashSetを扱う
  4. カウントとグループ化
← Learn Rust Codingに戻る