首页 > 解决方案 > 如何使用类似地图的闭包对 Rust 向量进行排序?

问题描述

我想使用某种类似闭包的格式对结构向量进行排序。这就是我的想法:

struct PointTracker {
    positive: u32,
    negative: u32,
}

// ....

fn main() {
    let item: Vec<PointTracker> // ....

    // e.g: [{positive: 3, negative: 4}, {positive: 5, negative: 0}, {positive: 2, negative: 10}]
    
    let sorted_item = item
        .iter()
        .sort_with(|x: PointTracker| x.positive - x.negative)
        .collect::<PointTracker>();

    // sorted from greatest to least:
    // [{positive: 5, negative: 0}, {positive: 3, negative: 4}, {positive:2, negative: 10}]
}

我正在寻找的是某种函数,就像上面一样,它根据闭包中返回的值对项目进行排序。这取正值,从中减去负值,然后返回结果。第一个未排序项目的总和将是:[-1, 5, -8]排序后的总和将是(如预期的那样):[5, -1, -8]

这个函数是否有某种板条箱,或者如果它不存在我应该自己编写?

标签: sortingrustiteratorclosures

解决方案


您正在搜索的功能是sort_by_key

#[derive(Debug)]
struct PointTracker {
    positive: u32,
    negative: u32,
}

fn main() {
    let mut item = vec![
        PointTracker {
            positive: 3,
            negative: 4,
        },
        PointTracker {
            positive: 5,
            negative: 0,
        },
        PointTracker {
            positive: 2,
            negative: 10,
        },
    ];

    item.sort_by_key(|x| x.positive as i32 - x.negative as i32);

    println!("{:#?}", item);
}

输出:

[
    PointTracker {
        positive: 2,
        negative: 10,
    },
    PointTracker {
        positive: 3,
        negative: 4,
    },
    PointTracker {
        positive: 5,
        negative: 0,
    },
]

推荐阅读