Pat*_*her 3 sorting match rust
我有Vector一些球员要按照以下标准进行排序:
championships(降序)wins(降序)name(升序)我在 Rust 中实现如下:
use std::cmp::Ordering;
#[derive(Debug)]
struct Player {
name: String,
championships: u8,
wins: u8,
}
fn main() {
let mut players = vec![
Player {
name: "Alice".to_string(),
championships: 3,
wins: 17,
},
Player {
name: "Bob".to_string(),
championships: 3,
wins: 19,
},
Player {
name: "Claire".to_string(),
championships: 4,
wins: 18,
},
Player {
name: "Dan".to_string(),
championships: 4,
wins: 18,
},
];
players.sort_by(|a, b| match b.championships.cmp(&a.championships) {
Ordering::Less => Ordering::Less,
Ordering::Greater => Ordering::Greater,
Ordering::Equal => match b.wins.cmp(&a.wins) {
Ordering::Less => Ordering::Less,
Ordering::Greater => Ordering::Greater,
Ordering::Equal => match a.name.cmp(&b.name) {
Ordering::Less => Ordering::Less,
Ordering::Greater => Ordering::Greater,
Ordering::Equal => Ordering::Equal,
},
},
});
dbg!(players);
}
Run Code Online (Sandbox Code Playgroud)
这按预期工作,如输出所示:
[src/main.rs:46] players = [
Player {
name: "Claire",
championships: 4,
wins: 18,
},
Player {
name: "Dan",
championships: 4,
wins: 18,
},
Player {
name: "Bob",
championships: 3,
wins: 19,
},
Player {
name: "Alice",
championships: 3,
wins: 17,
},
]
Run Code Online (Sandbox Code Playgroud)
然而,模式匹配代码非常重复,因为在大多数情况下我只是返回我已经得到的内容,例如:
[src/main.rs:46] players = [
Player {
name: "Claire",
championships: 4,
wins: 18,
},
Player {
name: "Dan",
championships: 4,
wins: 18,
},
Player {
name: "Bob",
championships: 3,
wins: 19,
},
Player {
name: "Alice",
championships: 3,
wins: 17,
},
]
Run Code Online (Sandbox Code Playgroud)
有什么捷径可以避免这种冗长的情况吗?
这实际上不是一个排序问题,而是一个模式匹配问题。(也许可以通过更优雅的方式按多个标准进行排序,但我不知道该怎么做,因为我有升序/降序标准进行排序。)
您的示例中的链接比较是std::cmp::Ordering::then(and then_with) 的用途:
players.sort_by(|a, b| {
b.championships
.cmp(&a.championships)
.then(b.wins.cmp(&a.wins))
.then(b.name.cmp(&a.name).reverse())
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
153 次 |
| 最近记录: |