2 ms·
For sorting sequential fields you can chain comparisons with .then(): struct Date { year: u32, month: u32, day: u32, }
by WakiMiko 8y ago
For sorting sequential fields you can chain comparisons with .then():
struct Date {
year: u32,
month: u32,
day: u32,
}
let mut vec: Vec<Date> = Vec::new();
vec.sort_by(|a,b| {
a.year.cmp(&b.year)
.then(a.month.cmp(&b.month))
.then(a.day.cmp(&b.day))
});
Alternatively you can derive PartialEq, PartialOrd, Eq and Ord for your struct, which will produce a lexicographic ordering based on the top-to-bottom declaration order of the struct's members:
#[derive(PartialEq, PartialOrd, Eq, Ord)]
struct Date {
year: u32,
month: u32,
day: u32,
}
- masklinn 8y agoOr you can use sort_by_key and extract the relevant sorting key as a tuple (or any other Ord structure) e.g. vec.sort_by_key(|d| (d.year, d.month, d.day)) sort_by is more flexible as it works fine with borrows, but when sorting on a series of integer values or references sort_by_key is great. > Alternatively you can derive PartialCmp for your struct, which will produce a lexicographic ordering based on the top-to-bottom declaration order of the struct's members: Do you mean PartialOrd? partial_cmp is the method. And `sort` requires absolute ordering (Ord) not just partial.
- WakiMiko 8y agoI quite like this tuple approach. And yeah, I meant Ord (and the required other Traits), I edited my post. Thanks for pointing this out.