如何使用类似地图的闭包对 Rust Vector 进行排序?

How to sort a Rust Vector with map-like closures?

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

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}]
}

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

这个函数是否有某种类型的箱子,或者如果它不存在我应该自己写一个?

您搜索的函数是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,
    },
]