🔰

[Rust] 文字列をキーとする配列のソート

2023/03/11に公開

こんなデータをソートしたい場合

let mut data = vec![
    ("攻撃力", 33.),
    ("会心率", 12.7),
    ("会心ダメージ", 20.4),
    ("防御力", 15.),
    ("会心ダメージ", 22.3),
    ("防御力", 33.4),
];

CODE

const ORDER: [&'static str; 4] = ["攻撃力", "防御力", "会心ダメージ", "会心率"];

fn main() {
    let mut data = vec![
        ("攻撃力", 33.),
        ("会心率", 12.7),
        ("会心ダメージ", 20.4),
        ("防御力", 15.),
        ("会心ダメージ", 22.3),
        ("防御力", 33.4),
    ];
    // 別のfnにしてもOK
    let fnc = |val| ORDER.iter().position(|&v| v == val);
    data.sort_by(|a, b| fnc(a.0).cmp(&fnc(b.0)));
    println!("{:?}", data);
    // [("攻撃力", 33.0), ("防御力", 15.0), ("防御力", 33.4), ("会心ダメージ", 20.4), ("会心ダメージ", 22.3), ("会心率", 12.7)]
}

ソート基準となる配列を作って、そのindexを利用します。
ソート自体はsort_byで実行しています。

Discussion