Rust中含PartialOrd浮点数的向量多字段最简排序方法
Rust 含浮点字段的结构体多字段排序最简方案
场景1:无第三方依赖需求
如果不需要引入外部库,直接使用sort_unstable_by配合链式比对即可,写法如下:
// 示例结构体:struct MyStruct { a: i32, b: f64, c: String } my_vec.sort_unstable_by(|x, y| { x.a.cmp(&y.a) // 可自行修改unwrap_or的参数调整NaN的排序优先级: // Ordering::Greater 表示NaN排在所有正常值之后 // Ordering::Less 表示NaN排在所有正常值之前 .then(x.b.partial_cmp(&y.b).unwrap_or(std::cmp::Ordering::Greater)) .then(x.c.cmp(&y.c)) });
如果能提前确认所有浮点字段没有NaN,可以直接把unwrap_or换成unwrap,性能几乎无损耗。
场景2:追求写法简洁,可接受第三方依赖
社区通用的最简方案是使用ordered-float库的OrderedFloat包装类型,它已经为浮点数实现了Ord trait,默认NaN排在所有正常值之后,可以直接适配原来的sort_unstable_by_key写法:
- 先在
Cargo.toml中添加依赖:
[dependencies] ordered-float = "4.2"
- 排序代码和原生写法几乎完全一致:
use ordered_float::OrderedFloat; my_vec.sort_unstable_by_key(|k| (k.a, OrderedFloat(k.b), k.c));
内容的提问来源于stack exchange,提问作者at54321
相关产品推荐
相关产品推荐

