rust - ordenado - Ordenar los datos de HashMap por valor
metodos de hashmap java (1)
¿Es este Rust idiomático?
No hay nada particularmente unidiomático , excepto posiblemente la restricción de tipo completo innecesaria en count_vec
; solo podrías usar
let mut count_vec: Vec<_> = count.iter().collect();
No es difícil, desde el contexto, determinar cuál es el tipo completo de count_vec
. También puede omitir la restricción de tipo para el count
totalidad , pero luego tendría que jugar shenanigans con sus literales enteros para tener el tipo de valor correcto inferido. Es decir, una anotación explícita es eminentemente razonable en este caso.
El otro cambio límite que podría realizar si cree que sería utilizar |a, b| a.1.cmp(b.1).reverse()
|a, b| a.1.cmp(b.1).reverse()
para el cierre de ordenación. El método Ordering::reverse
simplemente invierte el resultado para que menor que se convierta en mayor que, y viceversa. Esto hace que sea un poco más obvio que usted quiso decir lo que escribió, en lugar de transponer accidentalmente dos letras.
¿Puedo construir el count_vec de manera que consuma los datos de HashMaps y los posea?
No de ninguna manera significativa. El hecho de que HashMap
esté usando la memoria no significa que la memoria sea de alguna manera compatible con Vec
. Podría usar count.into_iter()
para consumir el HashMap
y mover los elementos (en lugar de iterar sobre los punteros), pero como char
y u32
son trivialmente copiables, esto realmente no le proporciona ningún beneficio.
Quiero ordenar los datos de HashMap por valor en Rust (por ejemplo, cuando se cuenta la frecuencia de caracteres en una cadena).
El equivalente de Python de lo que estoy tratando de hacer es:
count = {}
for c in text:
count[c] = count.get(''c'', 0) + 1
sorted_data = sorted(count.items(), key=lambda item: -item[1])
print(''Most frequent character in text:'', sorted_data[0][0])
Mi código Rust correspondiente tiene este aspecto:
// Count the frequency of each letter
let mut count: HashMap<char, u32> = HashMap::new();
for c in text.to_lowercase().chars() {
*count.entry(c).or_insert(0) += 1;
}
// Get a sorted (by field 0 ("count") in reversed order) list of the
// most frequently used characters:
let mut count_vec: Vec<(&char, &u32)> = count.iter().collect();
count_vec.sort_by(|a, b| b.1.cmp(a.1));
println!("Most frequent character in text: {}", count_vec[0].0);
¿Es este Rust idiomático? ¿Puedo construir el count_vec
de manera que consuma los datos de HashMaps y los posea (p. Ej., Usando map()
)? ¿Sería esto más idomático?