5.2.2. 浮点数 Vector 排序
问题:
你想对浮点类型的动态数组 vector 进行排序。
解决方案:
f32 或 f64 的 vector,可以使用 vec::sort_by
和 PartialOrd::partial_cmp
对其进行排序。
以下实例代码引用自开源书籍项目《Cookin’ with Rust》,笔者在其基础上稍作修改。
fn main() {
let mut vec = vec![1.1, 1.15, 5.5, 1.123, 2.0];
println!(" 排序前: {:?}", vec);
vec.sort_by(|a, b| a.partial_cmp(b).unwrap());
println!(" 排序后: {:?}", vec);
assert_eq!(vec, vec![1.1, 1.123, 1.15, 2.0, 5.5]);
}
代码第 5 行,使用 PartialOrd::partial_cmp
对浮点型 vector 进行排序。
构建并运行后,结果大抵如下所示。
排序前: [1.1, 1.15, 5.5, 1.123, 2.0]
排序后: [1.1, 1.123, 1.15, 2.0, 5.5]
断言的使用和整型 vector 排序类似,不再赘述。
讨论:
vec::sort_by
使用比较器(comparator )函数对切片进行排序,这种排序是稳定的(即不重新排序相等的元素)。比较器(comparator )函数必须为切片中的元素定义一个总顺序。如果不是全序关系排序,则不指定元素的顺序。如果排序是全序关系(对于所有 a
、b
和 c
),则:
- 完全反对称:
a < b
,a == b
或a > b
中的一个为真,并且 - 等量代换:
a < b
和b < c
意味着a < c
。对于==
和>
,同样具有等量代换关系。
使用 PartialOrd::partial_cmp
时,如果存在其它值(other )
,此方法将返回自己(self)
和其它值(other )
之间的排序。