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

a2mppw5e  于 2023-04-21  发布在  其他
关注(0)|答案(3)|浏览(165)

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

我有一个错误

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}`
z4bn682m

z4bn682m1#

编译器只需要很少的帮助就可以确定类型:添加类型注解

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

kzmpq1sx2#

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())
});
cbeh67ev

cbeh67ev3#

这可以用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);
}

相关问题