2011-01-25 18 views
23

¿Cómo puedo ordenar un mapa de este tipo:mapa Scala de clasificación

"01" -> List(34,12,14,23), "11" -> List(22,11,34) 

por los valores principio?

+0

¿Necesita el resultado para ser otro mapa, o simplemente está interesado en olvidar las claves una vez que se han utilizado para la clasificación? –

+0

Necesito resultado en otro mapa. –

+5

Creo que los mapas no están ordenados por definición, ¿verdad? – coubeatczech

Respuesta

57

Una forma es utilizar scala.collection.immutable.TreeMap, que siempre está ordenada por teclas:

val t = TreeMap("01" -> List(34,12,14,23), "11" -> List(22,11,34)) 

//If you have already a map... 
val m = Map("01" -> List(34,12,14,23), "11" -> List(22,11,34)) 
//... use this 
val t = TreeMap(m.toSeq:_*) 

se puede convertir a un Sec o la lista y ordenarla, también:

//by specifying an element for sorting 
m.toSeq.sortBy(_._1) //sort by comparing keys 
m.toSeq.sortBy(_._2) //sort by comparing values 

//by providing a sort function 
m.toSeq.sortWith(_._1 < _._1) //sort by comparing keys 

Hay muchas posibilidades, cada una más o menos conveniente en un cierto contexto.

+0

También puede adjuntar una secuencia ordenada arbitrariamente a un 'LinkedHashMap', que retendrá el orden de inserción para el recorrido. –

+0

heh heh, acaba de actualizar mi respuesta para usar '.toseq: _ *', ¡no vi que ya lo habías hecho! Prometer que no estoy robando :) –

+0

TreeMap con toSeq fue muy útil. –

15

Como se ha dicho, el tipo predeterminado es Map sin clasificar, pero siempre hay SortedMap

import collection.immutable.SortedMap 
SortedMap("01" -> List(34,12,14,23), "11" -> List(22,11,34)) 

Aunque supongo que no se puede utilizar eso, porque reconozco esta tarea y sospecha que su mapa es el resultado de un grupo por operación. Así que hay que crear un SortedMap vacío y añadir los valores:

val unsorted = Map("01" -> List(34,12,14,23), "11" -> List(22,11,34)) 
val sorted = SortedMap.empty[String, List[Int]] ++ unsorted 
//or 
val sorted = SortedMap(unsorted.toSeq:_*) 

O si usted no está casado con la interfaz Map, sólo puede convertirlo en una secuencia de tuplas. Tenga en cuenta que este enfoque solo funcionará si las claves y los valores tienen un orden definido. Las listas no tienen un orden predeterminado definido, por lo tanto, esto no funcionará con su código de ejemplo; por lo tanto, inventé algunos otros números.

val unsorted = Map("01" -> 56, "11" -> 34) 
val sorted = unsorted.toSeq.sorted 

Esto podría ser útil si primero se puede convertir sus listas a algún otro tipo (como una cadena), que se realiza mejor usando mapValues

actualización respuesta Sede de Landei, que muestra cómo puede proporcionar una función de clasificación personalizada que hará que este enfoque funcione.