[Rust]HashMap(ハッシュマップ)の要素をランダムに取得するには?

Rust

どうも、ちょげ(@chogetarou)です。

HashMap(ハッシュマップ)の要素をランダムに取得する方法を紹介します。

スポンサーリンク

方法

インターフェース, インターネット, プログラム, ブラウザ, Www

HashMap(ハッシュマップ)の要素をランダムに取得する方法は、3つあります。

ランダムな値(value)を取得

1つ目は、ランダムな値(value)を取得する方法です。

まず、必要なモジュールをインポートします。

use rand::seq::SliceRandom;

次に、HashMap(ハッシュマップ)の値(value)をVecに変換します。

変換したVecからchoose()を呼び出し、choose()の引数に「&mut rand::thread_rng()」を指定します。

最後に、choose()からunwrap()を呼び出します。

//map=対象のハッシュマップ, T=値の型
let values = map.values().cloned().collect::<Vec<T>>(); //値をVecに変換
let result = values.choose(&mut rand::thread_rng()).unwrap(); //ランダムな値

上記のchoose()は、対象のHashMap(ハッシュマップ)の値(value)をランダムに取得します。

使用例

use std::collections::HashMap;
use rand::seq::SliceRandom;

fn main(){
    let mut nums = HashMap::new();
    nums.insert("one", 1);
    nums.insert("two", 2);
    nums.insert("three", 3);
    nums.insert("four", 4);
    nums.insert("five", 5);
    
    let values = nums.values().cloned().collect::<Vec<i32>>();
    
    for _ in  0..5 {
        println!("{:?}", values.choose(&mut rand::thread_rng()).unwrap());
    }
}
出力:
5
1
2
2
4

ランダムなキー(key)を取得

2つ目は、ランダムなキー(key)を取得する方法です。

まず、必要なモジュールをインポートします。

use rand::seq::SliceRandom;

次に、HashMap(ハッシュマップ)のキー(key)をVecに変換します。

変換したVecからchoose()を呼び出し、choose()の引数に「&mut rand::thread_rng()」を指定します。

最後に、choose()からunwrap()を呼び出します。

//map=対象のハッシュマップ, T=キーの型
let keys = map.keys().cloned().collect::<Vec<T>>(); //キーをVecに変換
let result = keys.choose(&mut rand::thread_rng()).unwrap(); //ランダムなキー

上記のchoose()は、対象のHashMap(ハッシュマップ)のキー(key)をランダムに取得します。

使用例

use std::collections::HashMap;
use rand::seq::SliceRandom;

fn main(){
    let mut nums = HashMap::new();
    nums.insert("one", 1);
    nums.insert("two", 2);
    nums.insert("three", 3);
    nums.insert("four", 4);
    nums.insert("five", 5);
    
    let keys = nums.keys().cloned().collect::<Vec<&str>>();
    
    for _ in  0..5 {
        println!("{:?}", keys.choose(&mut rand::thread_rng()).unwrap());
    }
}
出力:
"two"
"three"
"one"
"five"
"four"

ランダムなキーと値のペアを取得

3つ目は、ランダムなキーと値のペアを取得する方法です。

まず、必要なモジュールをインポートします。

use rand::seq::SliceRandom;

次に、HashMap(ハッシュマップ)をVecに変換します。

変換したVecからchoose()を呼び出し、choose()の引数に「&mut rand::thread_rng()」を指定します。

最後に、choose()からunwrap()を呼び出します。

//map=対象のハッシュマップ
let items = map.iter().collect::<Vec<_>>(); //ハッシュマップをVecに変換
let result = items.choose(&mut rand::thread_rng()).unwrap(); //ランダムなペア

上記のchoose()は、対象のHashMap(ハッシュマップ)のキー(key)と値(value)をランダムに取得します。

使用例

use std::collections::HashMap;
use rand::seq::SliceRandom;

fn main(){
    let mut nums = HashMap::new();
    nums.insert("one", 1);
    nums.insert("two", 2);
    nums.insert("three", 3);
    nums.insert("four", 4);
    nums.insert("five", 5);
    
    let items: Vec<_> = nums.iter().collect::<Vec<_>>();
    
    for _ in  0..5 {
        println!("{:?}", items.choose(&mut rand::thread_rng()).unwrap());
    }
}
出力:
("two", 2)
("two", 2)
("four", 4)
("one", 1)
("one", 1)

まとめ

HashMap(ハッシュマップ)の要素をランダムに取得する方法は、次の3つです。

  • ランダムな値を取得する方法
    let values = map.values().cloned().collect::<Vec<T>>();
    let result = values.choose(&mut rand::thread_rng()).unwrap();
  • ランダムなキーを取得する方法
    let keys = map.keys().cloned().collect::<Vec<T>>();
    let result = keys.choose(&mut rand::thread_rng()).unwrap();
  • キーと要素を一緒にループする方法
    let items = map.iter().collect::<Vec<_>>();
    let result = items.choose(&mut rand::thread_rng()).unwrap();

コメント

タイトルとURLをコピーしました