如何对“ NaN”进行排序,使其大于任何其他数字并等于任何其他“ NaN”?

HiDefender

我正在基于两个条件对向量进行排序。第一个是可以是的浮点NaN,第二个是用于按字典顺序打断关系的字符串。

vec.sort_by(|a, b| {
    match (foo(a) as f64 / bar(a) as f64).partial_cmp(&(foo(b) as f64 / bar(b) as f64)) {
        Some(x) => {
            Ordering::Equal => name(a).cmp(name(b)),
            other => other,
        }
        None() => {
            //Not sure what to put here.
        }
    }
}

foo(a)返回int> 0,bar(a)返回int> = 0,name(a)返回& String

如何进行排序NaN,使其大于其他任何数字,并且等于其他任何数字NaN(字典式平局)?

Shepmaster

你已经知道如何处理的关系,你需要的是在所期望的方式来比较浮点。只要...写出您描述的代码:

use std::cmp::Ordering;
use std::f32;

fn main() {
    let mut vec = [91.0, f32::NAN, 42.0]; 

    vec.sort_by(|&a, &b| {
        match (a.is_nan(), b.is_nan()) {
            (true, true) => Ordering::Equal,
            (true, false) => Ordering::Greater,
            (false, true) => Ordering::Less,
            (false, false) => a.partial_cmp(&b).unwrap(),
        }
    });

    println!("{:?}", vec);
}

您可能会喜欢,也可以将它包装在一个代表键的结构中:

use std::cmp::Ordering;
use std::f32;

fn main() {
    let mut vec = [91.0, f32::NAN, 42.0];

    vec.sort_by_key(|&a| MyNanKey(a));

    println!("{:?}", vec);
}

#[derive(Debug, Copy, Clone, PartialEq)]
struct MyNanKey(f32);

impl Eq for MyNanKey {}

impl PartialOrd for MyNanKey {
    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
        Some(self.cmp(other))
    }
}

impl Ord for MyNanKey {
    fn cmp(&self, other: &Self) -> Ordering {
        match (self.0.is_nan(), other.0.is_nan()) {
            (true, true) => Ordering::Equal,
            (true, false) => Ordering::Greater,
            (false, true) => Ordering::Less,
            (false, false) => self.0.partial_cmp(&other.0).unwrap(),
        }
    }
}

我没有考虑过这是否适用于各种无穷大或非规范化的浮点值,因此请注意。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在比较期间,如何使NaN数值小于任何其他数值?

如何使用`std :: multimap`或任何其他容器对多个值进行排序?

如何使一个整数大于任何其他整数?

如何翻译<SelectInput />或任何其他组件的内容?

如何匹配文本之间的任何其他字符

如何使用 JQuery 或任何其他技术加载底部

如何将文档中的数组元素与任何其他数组进行 $match - mongodb 聚合

如何在其他脚本的任何其他函数中调用包含参数的函数?

如何防止任何iframe或任何其他脚本更改顶部窗口中的文档标题?

如何替换数据框中的所有各种空值,使其均为NaN,而不是“-”或其他

如何仅获取端口3000上运行的进程的PID,而没有任何其他信息?

Systemd:如何创建在任何其他脚本之前运行的脚本

如何使用$ request或任何其他方法从资源路由获取参数?

如何从$ dialog控制器获取信息到任何其他控制器?

如何创建不允许任何其他字符的唯一约束?

如何使用反射或任何其他实用工具完全打印Java Bean

如何使用Openllet OWL2推理(或任何其他)与耶拿TDB?

注释如何以Java或任何其他编程语言在内部工作?

如何使用sed,awk或任何其他命令填充结束标签?

如何在DOSBox或任何其他DOS仿真器中使用MASM?

如何使用git安装devoloper版本或应用程序的任何其他版本?

如何使用 onTouchEvent 或任何其他方式在 graphView 上绘制形状?

如何在除视图之外的任何其他功能中使用 api 响应数据?

如何通过 evt 对象获取元素的角色?或任何其他可区分的属性真的

如何删除 Cinnamon 或任何其他 DE 中的 KDE Connect 依赖项?

如何指定参数对象具有键并允许任何其他键的函数类型?

如何下载和使用除默认安装的内核以外的任何其他内核

SQL - 如何用任何其他循环替换 While 循环 - 性能问题

如何扩展float3或任何其他内置类型以符合Codable协议?