我正在尝试借助自定义比较器对向量进行排序。在 Rust 中正确的做法是什么?
我的代码
use std::cmp::Ordering;
fn main() {
let mut v = vec![0, -4, 1, 2, 3];
v.sort_by(|a, b| {
if a.abs() < b.abs() {
return Ordering::Less;
}
return Ordering::Greater;
});
println!("{:?}", v);
}
我有一个错误
5 | v.sort_by(|a: &i32, b: &i32| {
| + +
error: aborting due to 2 previous errors; 1 warning emitted
编译器只需要很少的帮助就可以找出类型:添加类型注释
Vec
声明:let mut v: Vec<i32> = vec![...]
Vec
的物品上:vec![0i32, -4, 1, 2, 3]
|a: &i32, b| { ... }
.Chayim 是正确的,但补充一下,您定义的顺序目前不是顺序。它从来没有相等元素的情况(比较
3
和3
将导致Ordering::Greater
结果)。
Ord::cmp
为您进行三向比较。
let mut v: Vec<i32> = vec![0, -4, 1, 2, 3];
v.sort_by(|a, b| {
a.abs().cmp(&b.abs())
});
sort_by_key
写得最简洁。
fn main() {
let mut v: Vec<i32> = vec![0, -4, 1, 2, 3];
v.sort_by_key(|a| a.abs());
println!("{:?}", v);
}