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) }
参考
リンク