yiskw note

機械学習やプログラミングについて気まぐれで書きます

【Rust】HashMapをソートする方法


RustのHashMapをソートする方法について調べたので,こちらにメモを残しておきます.

方法

HashMapVecに変換して,キーもしくはバリューでソートすれば良いです.
その際にsort_byを用いて,比較の基準をクロージャーで指定します.
キーでソートする場合は,vec.sort_by(|a, b| a.0.cmp(&b.0));
バリューでソートする場合は,vec.sort_by(|a, b| a.1.cmp(&b.1));
降順にする時は,vec.sort_by(|a, b| (-a.1).cmp(&(-b.1)));のように,マイナスをつけてあげれば良いです.

use std::collections::HashMap;

fn main() {
    let mut map: HashMap<&str, i32> = HashMap::new();
    map.insert("hoge", 100);
    map.insert("fuga", 500);
    map.insert("foo", 1);

    let mut vec: Vec<(&&str, &i32)> = map.iter().collect();
    vec.sort_by(|a, b| a.1.cmp(&b.1));
    println!("sort result: {:?}", vec);

    vec.sort_by(|a, b| (-a.1).cmp(&(-b.1)));
    println!("reverse sort result: {:?}", vec);
}

結果

sort result: [("foo", 1), ("hoge", 100), ("fuga", 500)]
reverse sort result: [("fuga", 500), ("hoge", 100), ("foo", 1)]

参考

rust - Sort HashMap data by value - Stack Overflow