如何在Rust中按f64类型price_per_kg字段排序Substance结构体向量
按f64字段排序结构体向量的解决方案
问题原因
sort_unstable_by_key要求排序键实现Ord trait,但f64仅实现了PartialOrd(因为存在NaN这类无法确定比较关系的值),因此无法直接使用该方法。
解决方案1:使用sort_unstable_by处理f64的PartialOrd
直接通过partial_cmp方法比较price_per_kg字段,同时处理partial_cmp返回的Option<Ordering>:
// 确定price_per_kg不会出现NaN时,直接unwrap结果 substances.sort_unstable_by(|a, b| a.price_per_kg.partial_cmp(&b.price_per_kg).unwrap()); // 需要处理NaN的场景(示例:把NaN放到排序结果末尾) substances.sort_unstable_by(|a, b| { a.price_per_kg.partial_cmp(&b.price_per_kg) .unwrap_or(std::cmp::Ordering::Greater) });
解决方案2:避免浮点运算,用整数比值排序(更推荐)
由于price_per_kg本质是price / mass_kg的结果,可通过整数交叉相乘的方式比较比值,既避免浮点精度损失,又天然符合Ord trait要求:
// 按单价升序排序,等价于price_per_kg的比较逻辑 substances.sort_unstable_by(|a, b| (a.price * b.mass_kg).cmp(&(b.price * a.mass_kg))); // 若需要降序排序,反转比较结果即可 substances.sort_unstable_by(|a, b| (b.price * a.mass_kg).cmp(&(a.price * b.mass_kg)));
注意:该方法要求mass_kg不为0,这在物质质量的实际场景中是合理的前提。
内容的提问来源于stack exchange,提问作者Pioneer_11
相关产品推荐
相关产品推荐

