web-dev-qa-db-fra.com

Scala Tri des cartes

Comment puis-je trier une carte de ce genre:

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

par les valeurs de début?

24
Adrian Modliszewski

Une solution consiste à utiliser scala.collection.immutable.Tremap, qui est toujours triée par les 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 un SEQ ou une liste et triez-le 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, chacun plus ou moins pratique dans un certain contexte.

61
Landei

Comme indiqué, le type par défaut Map est non formé, 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 devine que vous ne pouvez pas utiliser cela, car je reconnais ces devoirs et suspecte que votre carte est le résultat d'une opération de groupeby. Vous devez donc créer un tri 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 marié à 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 commande définie. Les listes n'ont pas de commande par défaut définie, cela ne fonctionnera donc pas avec votre code d'exemple - j'ai donc composé d'autres numéros à la place.

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

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

Mise à jour : Voir la réponse de Landei, qui montre comment vous pouvez fournir une fonction de tri personnalisée qui rendra cette approche.

16
Kevin Wright