我正在尝试借助自定义比较器对向量进行排序。在 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);
}
Run Code Online (Sandbox Code Playgroud)
我有一个错误
error[E0599]: no method named `abs` found for reference `&{integer}` in the current scope
--> src/main.rs:6:14
|
6 | if a.abs() < b.abs() {
| ^^^ method not found in `&{integer}`
Run Code Online (Sandbox Code Playgroud)
编译器只需要很少的帮助来确定类型:添加类型注释
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())
});
Run Code Online (Sandbox Code Playgroud)