ベクタのソート
整数のベクタをソートする
この例では、vec::sort を使って整数のベクタをソートします。代わりに
vec::sort_unstable を使うこともでき、こちらのほうが高速な場合がありますが、
等しい要素の順序は保持されません。
fn main() {
let mut vec = vec![1, 5, 10, 2, 15];
vec.sort();
assert_eq!(vec, vec![1, 2, 5, 10, 15]);
}
浮動小数点数のベクタをソートする
f32 または f64 の Vector は、vec::sort_by と f64::total_cmp を使ってソートできます。
PartialOrd::partial_cmp とは異なり、total_cmp は NaN 値をパニックさせることなく処理し、
それらをソート順の末尾に配置します。
fn main() {
let mut vec = vec![1.1_f64, 1.15, 5.5, 1.123, 2.0];
vec.sort_by(|a, b| a.total_cmp(b));
assert_eq!(vec, vec![1.1, 1.123, 1.15, 2.0, 5.5]);
}
構造体のベクタをソートする
name と age というプロパティを持つ Person 構造体のベクタを、その自然な
順序(名前と年齢)でソートします。Person をソート可能にするには、4 つのトレイト Eq,
PartialEq, Ord, PartialOrd が必要です。これらのトレイトは単純に derive できます。
また、vec:sort_by メソッドを使ってカスタムの比較関数を提供し、年齢だけでソートすることもできます。
#[derive(Debug, Eq, Ord, PartialEq, PartialOrd)]
struct Person {
name: String,
age: u32
}
impl Person {
pub fn new(name: &str, age: u32) -> Self {
Person {
name: name.to_string(),
age
}
}
}
fn main() {
let mut people = vec![
Person::new("Zoe", 25),
Person::new("Al", 60),
Person::new("John", 1),
];
// 導出された自然順序(名前と年齢)で people をソート
people.sort();
assert_eq!(
people,
vec![
Person::new("Al", 60),
Person::new("John", 1),
Person::new("Zoe", 25),
]);
// 年齢で people をソート
people.sort_by(|a, b| b.age.cmp(&a.age));
assert_eq!(
people,
vec![
Person::new("Al", 60),
Person::new("Zoe", 25),
Person::new("John", 1),
]);
}