如何在 Rust 中使用自定义比较器?

mas*_*cai 2 comparator rust

我正在尝试借助自定义比较器对向量进行排序。在 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)

Cha*_*man 5

编译器只需要很少的帮助来确定类型:添加类型注释

  • 关于Vec声明:let mut v: Vec<i32> = vec![...]
  • 或者在Vec的项目上:vec![0i32, -4, 1, 2, 3]
  • 或者在关闭时:|a: &i32, b| { ... }


Sil*_*olo 5

Chayim 是正确的,但补充一下,您定义的顺序目前还不是顺序。它从来不存在相等元素的情况(比较33将产生结果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)