yiskw note

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

Rustのベクター型をキーを指定してソートする


B - Do you know the second highest mountain?の問題をRustで解くにあたって,
ベクター型をキーを指定してソートする必要がありました.
その方法について調べたので.解答とともにこちらにメモを残しておきます.

ソートの仕方

Vec<i32>など整数型のベクタをソートする場合は,単にsortメソッドを呼び出すだけで良いです.

fn main() {
    let mut v: Vec<i32> = vec![2, 1, 3, 5, 4, 6];
    v.sort();
    println!("{:?}", v);
}

しかしながら,要素が浮動小数型などの場合は,そのままsortメソッドを使うことができません.
この場合は,sort_byメソッドを使用してキーを指定する必要があります.

fn main() {
    let mut v: Vec<f64> = vec![2.1, 1.4, 3.5, 5.5, 4.7, 6.8];
    v.sort_by(|a, b| a.partial_cmp(b).unwrap());
    println!("{:?}", v);
}

これを応用すると,タプルを要素として持つベクター型に対して, タプルの2つ目の要素をキーとしてソートすることもできます.

fn main() {
    let mut v: Vec<(i32, i32)> = vec![(2, 3), (1, 2), (4, 5), (10, 1)];
    v.sort_by(|a, b| a.1.partial_cmp(&(b.1)).unwrap());
    println!("{:?}", v);
}
[(10, 1), (1, 2), (2, 3), (4, 5)]

ちなみに降順にするにはマイナスをつけてあげれば良いです.

fn main() {
    let mut v: Vec<(i32, i32)> = vec![(2, 3), (1, 2), (4, 5), (10, 1)];
    v.sort_by(|a, b| (-a.1).partial_cmp(&(-b.1)).unwrap());
    println!("{:?}", v);
}
[(4, 5), (2, 3), (1, 2), (10, 1)]

問題の解法

B - Do you know the second highest mountain?は,以下のように解きました.

use proconio::{
    input,
    marker::{Bytes, Chars},
};

fn main() {
    input! {
        n: usize,
        mut st: [(String, i32); n],
    };

    st.sort_by(|x, y| (-x.1).partial_cmp(&(-y.1)).unwrap());
    println!("{}", st[1].0)
}

参考