Zer*_*Tek 0 sorting vector rust
我有一个自定义结构的向量和一个属性列表,用于按降序优先级排序该向量.例如:
struct TheStruct {
artist: String,
title: String,
date: String,
}
let order_vec: Vec<String> = vec!["artist".to_string(),"title".to_string(),"date".to_string()];
let item_vec: Vec<TheStruct> = Vec::new();
Run Code Online (Sandbox Code Playgroud)
我希望矢量按照给定的顺序排序order_vec
.在这个例子中,它应该首先按艺术家名称排序,当它相等时,它应该按标题排序.我不想将这种排序硬编码为order_vec
动态变化.
我找到了Vec::sort_by
哪个需要比较功能.如何动态生成该功能?有没有办法做到这一点没有sort_by
?
如何动态生成该功能
你没有.您有一个特定的闭包,其中包含动态行为.
在这里,我们列出了要应用的排序.当我们需要比较两个项目时,我们遍历列表.我们Ordering::then_with
只使用以前的比较时应用比较Equal
:
use std::cmp::Ordering;
#[derive(Debug, Copy, Clone)]
enum Field {
Artist,
Title,
Date,
}
struct TheStruct {
artist: String,
title: String,
date: String,
}
fn main() {
let mut items: Vec<TheStruct> = vec![];
use Field::*;
let orders = vec![Artist, Title];
items.sort_by(|a, b| {
orders.iter().fold(Ordering::Equal, |acc, &field| {
acc.then_with(|| {
match field {
Artist => a.artist.cmp(&b.artist),
Title => a.title.cmp(&b.title),
Date => a.date.cmp(&b.date),
}
})
})
})
}
Run Code Online (Sandbox Code Playgroud)
我在字段中使用枚举,因为当其中一种是未知字段时,我不想处理该做什么.