我有这个结构
pub struct Items {
pub symbol: String,
pub price: f64,
pub date: DateTime<Utc>,
}
我有一个这些结构的向量。我想按日期排序。我该怎么做呢?我试着推导PartialEq、Ord、Eq等……但Rust抱怨浮点字段。
最简单的方法是使用为Vec
实现的一个提供的排序函数,如sort_by
、sort_by_key
或sort_by_key_cached
。
// Using sort_by
foo_items.sort_by(|a, b| a.date.cmp(&b.date));
// Using sort_by_key
foo_items.sort_by_key(|x| x.date);
// Using sort_by_key_cached (Faster if key is very large)
foo_items.sort_by_cached_key(|x| x.date);
别忘了,你总是可以选择手动实现通常派生的特征。
use std::cmp::Ordering;
impl PartialEq for Items {
fn eq(&self, other: &Self) -> bool {
// idk what symbol is, but use it anyway
self.symbol == other.symbol && self.date == other.date
}
}
impl Eq for Items {}
impl PartialOrd for Items {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
self.date.partial_cmp(&other.date)
}
}
impl Ord for Items {
fn cmp(&self, other: &Self) -> Ordering {
self.date.cmp(&other.date)
}
}
编辑:我只是想在这里为任何正在查看此内容的人添加一个额外的注释。
首先,这些排序函数是为切片而不是
Vec
实现的(尽管示例没有改变)。使用时,会隐式调用Vec<T>
对DerefMut
的实现,以获得实现排序函数的&mut [T]
。这意味着您可以对任何可以获得可变切片的数据结构进行排序。其次,使用
sort_unstable
几乎总是比使用sort
更可取(_by
和_by_key
也有变体)。引用文件:对切片进行排序,但可能不会保留相等元素的顺序。
这种排序是不稳定的(即,可以对相等的元素重新排序),在适当的位置(即,不分配),并且在最坏的情况下为O(n*log(n))。
当前实现
当前算法基于Orson Peters的模式击败快速排序,该算法将随机快速排序的快速平均情况与堆排序的快速最坏情况相结合,同时在具有特定模式的切片上实现线性时间。它使用一些随机化来避免退化的情况,但使用固定的种子来始终提供确定性行为。它通常比稳定排序更快,除非在少数特殊情况下,例如,当切片由几个级联排序序列组成时。
#[derive(Debug)]
pub struct S {
pub s: f64,
}
fn main() {
let mut v = vec![S{s:0.3}, S{s:1.3}, S{s:7.3}];
v.sort_by(|a, b| a.s.partial_cmp(&b.s).unwrap());
println!("{:#?}",v);
}