Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ベクタのソート

整数のベクタをソートする

std-badge cat-science-badge

この例では、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]);
}

浮動小数点数のベクタをソートする

std-badge cat-science-badge

f32 または f64 の Vector は、vec::sort_byf64::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]);
}

構造体のベクタをソートする

std-badge cat-science-badge

nameage というプロパティを持つ 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),
        ]);

}