2011-08-06 9 views

Respuesta

23
scala> val sorted1 = tm.toList.sortBy (_._2)               
sorted1: List[(java.lang.String, Double)] = List((Stock3,3.7), (Stock1,4.2), (Stock2,5.9)) 

scala> val sorted2 = tm.toList.sortBy (_._1) 
sorted2: List[(java.lang.String, Double)] = List((Stock1,4.2), (Stock2,5.9), (Stock3,3.7)) 

Revert sorted1, conseguirlo descendente, o sortWith:

scala> val sorted3 = tm.toList.sortWith (_._2 > _._2) 
sorted3: List[(java.lang.String, Double)] = List((Stock2,5.9), (Stock1,4.2), (Stock3,3.7)) 

versión 4, ordenar por -x (menos x):

scala> val sorted4 = tm.toList.sortBy (-_._2) 
sorted4: List[(java.lang.String, Double)] = List((Stock2,5.9), (Stock1,4.2), (Stock3,3.7)) 
2

Si el conjunto de datos es más complicado de lo estrictos pares de valores clave:

Hay un conjunto de datos de la biblioteca de Java que se puede utilizar para ordenar un conjunto de datos por cualquier campo representados en ese conjunto de datos. Es fácil de usar y extremadamente flexible.

http://casperdatasets.googlecode.com

4

El El problema aquí es que busca por clave, por lo que no sirve de nada ordenar por valor: aún tendrá que hacer un seguimiento de las llaves de alguna manera.

Considere, por ejemplo, un LinkedHashMap ordenado por valor. Encuentra la clave a través de la tabla hash e itera usando la lista enlazada. Desafortunadamente, requiere la inserción de O(n), porque debe recorrer la lista para encontrar la clave.

Uno podría mejorar esto manteniendo un árbol y una tabla hash. En cualquier caso, todavía hay un golpe en las operaciones que agregan o quitan elementos, porque ahora cambian dos estructuras de datos. Y eso ni siquiera cuenta los elementos modificadores.

Entonces, ¿por qué no simplemente ordenar los elementos del mapa?

tm.toSeq.sorted(Ordering by ((_: (String, Double))._2)) 
Cuestiones relacionadas