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

问题描述 投票:0回答:3

我正在尝试借助自定义比较器对向量进行排序。在 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
rust comparator
3个回答
5
投票

编译器只需要很少的帮助就可以找出类型:添加类型注释

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

4
投票

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

0
投票

这可以用

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.