如何使用类似地图的闭包对 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,
},
]
我想使用某种类似于闭包的格式对结构 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,
},
]