在浮点向量上使用 max_by_key [英] Using max_by_key on a vector of floats

查看:20
本文介绍了在浮点向量上使用 max_by_key的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用 max_by_key 根据某个键从 f64 的向量中获取最大值.这是一个简单的例子,用一个小向量和abs作为key:

I want to use max_by_key to get the maximum value from a vector of f64s based on a certain key. This is a simple example, with a small vector and abs as the key:

let a: Vec<f64> = vec![-3.0, 0.2, 1.4];
*a.iter().max_by_key(|n| n.abs()).unwrap()

但是,由于 f64 没有实现 Ord,所以我得到了

However, since f64 does not implement Ord, I get

    error[E0277]: the trait bound `f64: std::cmp::Ord` is not satisfied
 --> src/main.rs:3:15
  |
3 |     *a.iter().max_by_key(|n| n.abs()).unwrap();
  |               ^^^^^^^^^^ the trait `std::cmp::Ord` is not implemented for `f64`

同样,sort_by_key 失败并出现同样的错误:

Similarly, sort_by_key fails with the same error:

a.sort_by_key(|n| n.abs())

我知道我可以绕过部分排序限制,使用 sort_by

I know I can get around the partial ordering restriction to sort a vector of floats with sort_by

b.sort_by(|m, n| m.partial_cmp(n).unwrap_or(Less))

但这必须在一个向量 b 上调用,然后就得回去找a的对应元素,看起来复杂又慢.随着列表中项目数量的增加,我想尽量减少通过数据的次数.

but that would have to be called on a vector b for which I've computed the key (in this case abs) for each element of a, and then I would have to go back and find the corresponding element of a, which seems complicated and slow. As the number of items in the list grows, I'd like to minimize passes through the data.

有什么解决方法吗?

推荐答案

如果您不想创建包装器类型,可以使用 ordered_floatord_subset 板条箱.例如

If you do not want to create a wrapper type you can use the ordered_float or ord_subset crate. For example

extern crate ordered_float;
extern crate ord_subset;

#[test]
fn test_example_() {
    use ordered_float::OrderedFloat;
    // OrderedFloat -> NaN is greater than all other values and equal to itself.
    // NotNaN -> NotNaN::new panics if called with NaN.

    let mut a: Vec<f64> = vec![-3.0, 0.2, 1.4];

    let max = *a.iter().max_by_key(|n| OrderedFloat(n.abs())).unwrap();
    assert_eq!(-3.0, max);

    a.sort_by_key(|n| OrderedFloat(n.abs()));
    assert_eq!(vec![0.2, 1.4, -3.0], a);
}

#[test]
fn test_example_ord_subset() {
    use ord_subset::OrdSubsetIterExt;

    let a: Vec<f64> = vec![-3.0, 0.2, 1.4];

    // For f64, NaN is ignored.
    let max = *a.iter().ord_subset_max_by_key(|n| n.abs()).unwrap();
    assert_eq!(-3.0, max);

    // ord_subset does not help with the sorting problem in the question
}

这篇关于在浮点向量上使用 max_by_key的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆