用比较器对向量进行分类,该比较器动态地改变其行为



我有一个自定义结构的向量,以及用于在降级优先级以订购该向量的属性列表。例如:

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

我希望向量按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),
                }
            })
        })
    })
}

我在字段上使用了枚举

最新更新