dafont - Usando max_by_key en un vector de flotadores
label png (1)
Si no desea crear un tipo de envoltura, puede usar el cajón ordenado_float o ord_subset . Por ejemplo
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
}
Quiero usar max_by_key
para obtener el valor máximo de un vector de f64
s basado en una determinada clave. Este es un ejemplo simple, con un pequeño vector y abs
como la clave:
let a: Vec<f64> = vec![-3.0, 0.2, 1.4];
*a.iter().max_by_key(|n| n.abs()).unwrap()
Sin embargo, dado que f64
no implementa Ord
, obtengo
src/satyrs/heuristics.rs:35:15: 35:38 error: the trait `core::cmp::Ord` is not implemented for the type `f64` [E0277]
src/satyrs/heuristics.rs:35 *a.iter().max_by_key(|x| x.abs()).unwrap()
Del mismo modo, sort_by_key
falla con el mismo error:
a.sort_by_key(|n| n.abs())
Sé que puedo evitar la restricción parcial de ordenar para ordenar un vector de flotadores con sort_by
b.sort_by(|m, n| m.partial_cmp(n).unwrap_or(Less))
pero eso tendría que ser llamado en un vector b
para el cual he calculado la clave (en este caso abs
) para cada elemento de a
, y luego tendría que volver atrás y encontrar el elemento correspondiente de a
, lo cual parece complicado y lento A medida que crezca la cantidad de elementos en la lista, me gustaría minimizar los pases a través de los datos.
¿Alguna solución?