どうも、ちょげ(@chogetarou)です。
HashMap(ハッシュマップ)の要素をランダムに取得する方法を紹介します。
方法

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();
コメント