Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Rust辞典

  1. トップページ
  2. Rust辞典
  3. HashMap::keys() / values() / iter()

HashMap::keys() / values() / iter()

『HashMap』のキー・値・キーと値のペアをイテレーションで取り出すメソッドです。ループ処理でマップの内容を順に処理する際に使用します。

構文
// キーの参照を取り出すイテレータを生成します。
for key in map.keys() { }

// 値の参照を取り出すイテレータを生成します。
for value in map.values() { }

// キーと値のペア(タプル)を取り出すイテレータを生成します。
for (key, value) in map.iter() { }

// キーと値の所有権を取り出すイテレータを生成します(mapは消費されます)。
for (key, value) in map.into_iter() { }
メソッド一覧
メソッド概要
keys()キーの参照を返すイテレータを生成します。値には触れずキーだけを処理したい場合に使います。
values()値の参照を返すイテレータを生成します。キーが不要で値だけを処理したい場合に使います。
values_mut()値の可変参照を返すイテレータを生成します。ループ内で値を書き換えたい場合に使います。
iter()キーと値の参照のペア『(&K, &V)』を返すイテレータを生成します。最もよく使う汎用的なイテレーション方法です。
iter_mut()キーの参照と値の可変参照のペア『(&K, &mut V)』を返すイテレータを生成します。
into_iter()キーと値の所有権を持つペア『(K, V)』を返すイテレータを生成します。呼び出し後はマップを使用できません。
サンプルコード
use std::collections::HashMap;

fn main() {
    let mut scores: HashMap<String, i32> = HashMap::new();
    scores.insert(String::from("Alice"), 100);
    scores.insert(String::from("Bob"), 85);
    scores.insert(String::from("Carol"), 92);

    // キーだけをループします。
    println!("--- keys ---");
    for key in scores.keys() {
        println!("{}", key);
    }

    // 値だけをループします。
    println!("--- values ---");
    for val in scores.values() {
        println!("{}", val);
    }

    // キーと値のペアをループします。
    println!("--- iter ---");
    for (name, score) in scores.iter() {
        println!("{}: {}", name, score);
    }

    // 値を可変参照で取り出して書き換えます。
    for val in scores.values_mut() {
        *val += 5; // 全員のスコアに5点加算します。
    }
    println!("加算後: {:?}", scores);
}
概要

『HashMap』のイテレーションメソッドは、用途に応じて3種類から選びます。キーだけ必要なら『keys()』、値だけなら『values()』、両方必要なら『iter()』を使います。『HashMap』の順序は挿入順ではなくハッシュ値に依存するため、反復順序は実行ごとに異なる場合があります。

値をループ内で変更したい場合は『values_mut()』または『iter_mut()』を使います。また、ループ後にマップ自体が不要な場合は『into_iter()』で所有権ごと取り出すと効率的です。『into_iter()』を使ったあとはマップは使用できなくなる点に注意してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。