Convertit une Chaîne de la liste de la Carte[String, List]
Je suis en train de convertir List("a,1" , "b,2" , "c,3" , "a,2" , "b,4")
de type scala.collection.immutable.HashMap[String, java.util.List[String]]
avec des valeurs :
a -> 1,2
b -> 2,4
c -> 3
De sorte que chaque clé contient une Liste de ses valeurs.
Voici mon code pour l'instant :
object ConvertList extends Application {
var details = new scala.collection.immutable.HashMap[String, java.util.List[String]]
val strList = List("a,1" , "b,2" , "c,3" , "a,2" , "b,4")
//Get all values
val getValue : Function1[String, String] = { a => a.split(",")(1) }
val allValues : List[String] = strList map getValue
//get unique values
val uniqueValues = allValues.toSet[String]
//Somehow map each unique value to a value in the original List....
println(uniqueValues)
println(strList.flatten)
//userDetails += "1" -> List("a","b",
}
Comment cette conversion peut être effectuée ?
- êtes-vous rigoureux sur immuable table de hachage?
- non, je suis juste essayer d'éviter un impératif solution.
Vous devez vous connecter pour publier un commentaire.
De sortie :
Listes ne serait pas dans le même ordre, mais en général, il est tout à fait faisable problème:
Il y a déjà une bonne partie de la prend, mais que penser de quelque chose de similaire à ce que Marth propose:
Cela repose fortement sur la programmation fonctionnelle, et se termine avec un
Map
de typeMap[String, java.util.List[String]]
, tout n'est pas juste de prendre des positions fixes dans la chaîne d'entrée, mais des fentes à la virgule (imaginez d'avoir un nombre de plus de 9, nécessitant plus d'un chiffre).Aussi, si il y a plus d'une valeur à partir de la scission, le
collect
méthode des filtres loin.À l'aide de
groupBy
fait de ce droit de l'avant, puisque vous voulez unMap
. LegroupBy
divise chaque élément de laList
par,
et prend la première qui est la clé. Qui donne ceci:scala.collection.immutable.Map[String,List[String]] = Map(b -> List(b,2, b,4), a -> List(a,1, a,2), c -> List(c,3))
. De là, il est juste de traitement pour obtenir les chiffres de chaqueList
de valeurs.Cela renvoie une
Map[String, List[Char]]
. Il y a un peu plus de travail à faire si vous voulezscala.collection.immutable.HashMap[String, java.util.List[String]]
retourné, mais c'est la partie facile.De départ
Scala 2.13
, nous pouvons utiliser la nouvelle groupMap méthode qui (comme son nom l'indique) est un passe-équivalent d'ungroupBy
et unmap
ping sur des éléments groupés:Ce:
divise chaque chaîne (production de
List(Array(a, 1), Array(b, 2), ...)
)group
s des éléments basés sur leur première partie (_(0)
) (groupe de partie de groupeCarte)map
s groupées des éléments de leur deuxième partie (_(1)
) (carte de la partie de groupe deCarte)