Vector 在浮点向量上使用max_by_键

Vector 在浮点向量上使用max_by_键,vector,iterator,rust,max,Vector,Iterator,Rust,Max,我想使用max\u by\u key从基于某个键的f64s向量中获取最大值。这是一个简单的示例,使用一个小向量和abs作为键: let a: Vec<f64> = vec![-3.0, 0.2, 1.4]; *a.iter().max_by_key(|n| n.abs()).unwrap() 类似地,sort\u by\u key也会失败,并出现相同的错误: a.sort_by_key(|n| n.abs()) 我知道我可以绕过偏序限制,用sort\u by b.sort_by(

我想使用
max\u by\u key
从基于某个键的
f64
s向量中获取最大值。这是一个简单的示例,使用一个小向量和
abs
作为键:

let a: Vec<f64> = vec![-3.0, 0.2, 1.4];
*a.iter().max_by_key(|n| n.abs()).unwrap()
类似地,
sort\u by\u key
也会失败,并出现相同的错误:

a.sort_by_key(|n| n.abs())
我知道我可以绕过偏序限制,用
sort\u by

b.sort_by(|m, n| m.partial_cmp(n).unwrap_or(Less))
但这必须在向量
b
上调用,我已经计算了
a
的每个元素的键(在本例中为
abs
),然后我必须返回并找到
a
的对应元素,这看起来既复杂又缓慢。随着列表中项目数量的增加,我希望尽量减少通过数据的次数


是否有解决方法?

如果不想创建包装类型,可以使用或板条箱。比如说

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
}
订购的外部板条箱\u浮子;
外部板条箱ord_子集;
#[测试]
fn测试(示例){
使用ordered_float::OrderedFloat;
//OrderedFloat->NaN大于所有其他值并等于自身。
//NotNaN->NotNaN::如果使用NaN调用,则会出现新的恐慌。
让mut a:Vec=Vec![-3.0,0.2,1.4];
设max=*a.iter().max|u by_键(| n | OrderedFloat(n.abs()).unwrap();
断言(最大值-3.0);
a、 按键排序(| n | OrderedFloat(n.abs());
断言(vec![0.2,1.4,-3.0],a);
}
#[测试]
fn测试示例ord子集(){
使用ord_子集::ord子集REXT;
设a:Vec=Vec![-3.0,0.2,1.4];
//对于f64,忽略NaN。
设max=*a.iter().ord_subset_max_by_key(|n | n.abs()).unwrap();
断言(最大值-3.0);
//ord_子集对问题中的排序问题没有帮助
}

用于
f64
周围的包装类型。这迫使您定义如何处理
NaN
。对于类似的事情。不要使用
.unwrap\u或(更少)
-这似乎是没有实现/包括包装类型的内在方法,所以我接受这一点。谢谢