Tri des cartes Scala

Comment trier une carte de ce genre:

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

Par les valeurs de début?

24
demandé sur Mia Clarke 2011-01-25 15:29:54

2 réponses

Une façon est d'utiliser scala.collection.immuable.TreeMap, qui est toujours trié par clés:

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:_*)

Vous pouvez le convertir en Seq ou List et le trier aussi:

//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

Il y a beaucoup de possibilités, chacune plus ou moins pratique dans un certain contexte.

59
répondu Landei 2011-01-25 12:44:32

Comme indiqué, le type par défaut Map n'est pas trié, mais il y a toujours SortedMap

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

Bien que je suppose que vous ne pouvez pas l'utiliser, parce que je reconnais ce devoir et soupçonne que votre carte est le résultat d'une opération groupBy. Vous devez donc créer une SortedMap vide et ajouter les valeurs:

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:_*)

Ou si vous n'êtes pas lié à l'interface Map, vous pouvez simplement le convertir en une séquence de tuples. Notez que cette approche ne fonctionnera que si les clés et les valeurs ont une définition commander. Les listes n'ont pas d'ordre par défaut défini, donc cela ne fonctionnera pas avec votre exemple de code - j'ai donc composé d'autres nombres à la place.

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

Cela peut être utile si vous pouvez d'abord convertir vos listes en un autre type (comme une chaîne), ce qui est mieux fait en utilisant mapValues

Update: Voir la réponse de Landei, qui montre comment vous pouvez fournir une fonction de tri personnalisée qui fera fonctionner cette approche.

15
répondu Kevin Wright 2011-01-25 13:08:23