使用多个键排序时,如何反转单个键的顺序?例如:
vec.sort_by_key(|k| (foo(k).reverse(), bar(k)));
最佳答案
您可以使用 sort_by
与 Ordering::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/