sorting - 使用多个键排序时反转特定键

标签 sorting rust

使用多个键排序时,如何反转单个键的顺序?例如:

vec.sort_by_key(|k| (foo(k).reverse(), bar(k)));

最佳答案

您可以使用 sort_byOrdering::reverse 配对而不是 sort_by_key

use std::cmp::Ordering;

#[derive(Debug)]
struct Foo(&'static str, u8);

impl Foo {
    fn name(&self) -> &str { self.0 }
    fn len(&self) -> u8 { self.1 }
}

fn main() {
    let mut vec = vec![Foo("alpha", 1), Foo("beta", 2), Foo("beta", 1)];

    vec.sort_by(|a, b| {
        match a.name().cmp(b.name()).reverse() {
            Ordering::Equal => a.len().cmp(&b.len()),
            other => other,
        }
    });

    println!("{:?}", vec);
}

这按逆字母顺序排序,然后领带按数字升序排序:

[Foo("beta", 1), Foo("beta", 2), Foo("alpha", 1)]

从 Rust 1.17 开始(通过 RFC 1677 ),你可以这样写:

vec.sort_by(|a, b| {
    a.name().cmp(b.name()).reverse()
        .then(a.len().cmp(&b.len()))
});

如果你有可以自然否定/反转的东西,你可以simply negate the key .

关于sorting - 使用多个键排序时反转特定键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40369255/

相关文章:

javascript - jquery-datatables 多列排序方向

php - 如何在laravel5中获取另一个表的列数据?

sorting - 文档的重新评分和排序

syntax - 如何部分初始化 ArrayVec?

rust - 创建 Box<dyn Trait> 时如何转换为 dyn Trait

java - 集合未按预期顺序排序,例如±±在zzz之后

java - 按属性对自定义对象的 ArrayList 进行排序

validation - 如何检查一个字符是 ASCII 码还是句点?

rust - 函数重载技巧-编译器无法选择要调用的函数

csv - 如何迭代/流式传输 gzip 文件(包含单个 csv)?