2015-02-11 53 views
2

我明白为什么浮点数没有Ord的实现,但是当我想要懒惰并使用迭代器时,这并没有特别的帮助我。如何获得包含浮点数的迭代器的最小值?

没有任何人有含浮点数的迭代器周围的工作或一个简单的方法来取最小值(最小,min_by)?

我知道一个可以进行排序(这是慢)或其他类型的包装,并实施必要的行业(这是冗长的),但我希望的东西多了几分优雅。

回答

5

花车有自己min method,处理NaN的一致,这样你就可以折叠迭代器:

use std::f64; 

fn main() { 
    let x = [2.0, 1.0, -10.0, 5.0, f64::NAN]; 

    let min = x.iter().fold(f64::INFINITY, |a, &b| a.min(b)); 
    println!("{}", min); 
} 

打印-10

如果你想不同的NaN处理,你可以使用PartialOrd::partial_cmp。例如,如果您想宣传NaN,请使用以下折叠:

use std::f64; 
use std::cmp::Ordering; 

fn main() { 
    let x = [2.0, 1.0, -10.0, 5.0, f64::NAN]; 

    let min = x.iter().fold(f64::INFINITY, |a, &b| { 
     match PartialOrd::partial_cmp(&a, &b) { 
      None => f64::NAN, 
      Some(Ordering::Less) => a, 
      Some(_) => b, 
     } 
    }); 
    println!("{}", min); 
} 
+0

的std :: CMP :: partial_min不存在了。 – 2017-04-13 14:20:59

0

也许这样?

fn main() { 
    use std::cmp::Ordering; 
    let mut x = [2.0, 1.0, -10.0, 5.0]; 
    x.sort_by(|a, b| a.partial_cmp(b).unwrap_or(Ordering::Equal)); 
    println!("min in x: {:?}", x); 
} 

有一件事我挣扎是sort_by变异到位矢量,所以你不能在一个链直接使用它。

相关问题