freepik dafont vector iterator rust max

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?