我如何排序' NaN ',使它大于任何其他数字,并等于任何其他' NaN '



我根据两个标准对向量进行排序。第一个是一个浮点数,可以是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(字典决胜)?

您已经知道如何处理关系,您所需要的只是以所需的方式比较浮点数。只是…写你描述的代码:

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(),
        }
    }
}

我没有考虑过这是否适用于各种无穷大或非规范化的浮点值,所以要小心。

相关内容

  • 没有找到相关文章

最新更新