sort_byを使ったソートの実装方法です。
sort_by
で並べ替え
- 昇順:
list.sort_by(|a, b| a.key.cmp(&b.key))
- 降順:
list.sort_by(|a, b| b.key.cmp(&a.key))
目次
sort_by で昇順・降順に並び替える
以下のような名前と標高(m)をキーに持つ構造体 Mountain を格納したベクタ型を
指定したキー(ここでは標高)で並び替えをしてみたいと思います。
struct Mountain {
name: String,
elevation: u32,
}
昇順に並び替える
標高の昇順に並び替える場合は、list.sort_by(|a, b| a.key.cmp(&b.key))
で並び替えます。
#[derive(Debug)]
struct Mountain {
name: String,
elevation: u32,
}
impl Mountain {
pub fn new(name: String, elevation: u32) -> Self {
Mountain {
name,
elevation
}
}
}
fn main() {
let mut mountains = vec![
Mountain::new("高尾山".to_string(), 599),
Mountain::new("富士山".to_string(), 3776),
Mountain::new("槍ヶ岳".to_string(), 3180),
];
// 標高の昇順
mountains.sort_by(|a, b| a.elevation.cmp(&b.elevation));
for m in mountains {
println!("name: {}, elevation: {}", m.name, m.elevation);
}
}
実行結果
name: 高尾山, elevation: 599
name: 槍ヶ岳, elevation: 3180
name: 富士山, elevation: 3776
降順に並び替える
降順はlist.sort_by(|a, b| b.key.cmp(&a.key))
で、昇順のときとa
とb
を入れ替えるだけでOKです。
// 標高の降順
mountains.sort_by(|a, b| b.elevation.cmp(&a.elevation));
実行結果
name: 富士山, elevation: 3776
name: 槍ヶ岳, elevation: 3180
name: 高尾山, elevation: 599
まとめ
sort_by
でキーを指定した昇順の並び替えのサンプルコードはよく見つかるのですが、
降順はパッと見つからなかったので備忘録として残しておきます。
簡単な記事ですみませんw
著:初田直也, 著:山口聖弘, 著:吉川哲史, 著:豊田優貴, 著:松本健太郎, 著:原将己, 著:中村謙弘, 著:フォルシア株式会社
¥3,208 (2024/11/22 22:08時点 | Amazon調べ)
ポチップ
コメント