0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

(DAY13) 俺と学ぶRust言語~HashMap~

Posted at

今日の内容

  • HashMapとは
  • HashSetとの違い

はじめに

前回は外部クレート「uint」を使って巨大な整数型を自作しました。今回は、Rust標準機能のHashMapについて学びます。

HashMapとは

HashMap はRustの標準ライブラリが提供する キーと値のペアを管理するデータ構造 です。HashMapを使うと、データをキーで管理し、値を効率的に取得・更新できます。

「キー」 という言葉に聞きなれないので、学ぶ気力が失せてしまうかもしれませんが、以下のように考えてください。
例えば、スマホの電話帳を想像してください。
名前を入力すると、登録した電話番号がでてきます。このとき、「名前」が 「キー」、「電話番号」が 「値」 です。
つまり、「キー」は情報を探すための手がかりになるもの、「値」はそのキーに対応する情報です。

他にも、例えば以下のようなときに使えます。

  • 学生の名前と成績を対応付けたいとき
    学生名をキー、成績を値として保存します
  • 商品のIDと価格を管理したいとき
    商品IDをキー、価格を値として保存します
  • 単語の出現回数を数えるとき
    単語をキー、出現回数を値として管理します

HashMapは、キーが一意 である(同じ名前のものが重複しない)必要があるため、同じキーを複数回挿入すると、古い値は新しい値で上書きされます。

HashMapの基本的な使い方

HashMapは標準ライブラリstd::collections::HashMap;からインポートします。

use std::collections::HashMap;
fn main() {
    let mut scores = HashMap::new();

    scores.insert("Alice", 85);
    scores.insert("Bob", 92);
    if let Some(score) = scores.get("Alice") {
        println!("Alice's score is {}", score);
    } else {
        println!("No score found for Alice!");
    }

    scores.insert("Alice", 90);

    scores.remove("Bob");

    for (name, score) in &scores {
        println!("{}: {}", name, score);
    }
}
/******** 実行結果 ********

Alice's score is 85
Alice: 90

*************************/

このプログラムでは、HashMapにおける、いくつかの基本的な操作をしています。
まず、空のHashMapはStringと同じようにnewを使って宣言します。

let mut 名前 = HashMap::new();

つぎに、要素の追加はinsertを使用します。

名前.insert(キー, );

要素の取得はgetを使用します。

名前.get(キー)

要素の削除はremoveを使用します。

名前.remove(キー);

また、HashMapはタプルのベクタに対してcollectメソッドを使用することでも作成できます。

use std::collections::HashMap;

fn main(){
    let items  = vec![("リンゴ", 3), ("バナナ", 5), ("オレンジ", 2)];
    let fruit_counts: HashMap<_, _> = items.into_iter().collect();
    for (fruit, count) in &fruit_counts {
        println!("{}: {}", fruit, count);
    }
}
/******** 実行結果 ********
バナナ: 5
リンゴ: 3
オレンジ: 2
*************************/

他によく使われるのは、「.entry()」です。これは、特定のキーのエントリ(キーと値のペア)を取得します。このメソッドは、キーが存在しない場合に値を挿入するのに便利です。

use std::collections::HashMap;

fn main(){
    let mut map = HashMap::new();
    map.entry("key1").or_insert(10);
    println!("{:?}", map);
}
/******** 実行結果 ********

{"key1": 10}

*************************/

HashSetとのちがい

HashMapがキーと値のペアであるのに対し、HashSetは値のみで構成されます。
値がなく、キーだけのHashMapを想像するとわかりやすいかもしれません。つまり、HashSetには値のみを追加することができ、それらは一意なので、同じ値で重複することはないという保証になります。

おわりに

今日紹介したいことは全て出し切れたので今日はここまでにします。
今回は、HashMapについて学びました。次回は構造体について学びたいと思います。
ご精読ありがとうございました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?