2017-04-10 6 views
0

Je suis débutant dans Scala, j'ai une liste comme ci-dessous et que vous voulez convertir en carte.J'ai essayé avec MultiMap mais je ne suis pas capable d'atteindre mon objectif.Toute aide sera appréciable.Comment changer la liste en multimap dans scala?

object Mapis{ 
    def main(args: Array[String]) { 
     val list= 
     ("rcdTypCd"="Q1", 
     "rcdTypCd"="W1", 
     "rcdTypCd"="E1", 
     "rcdTypCd"="R1", 
     "rcdTypCd"="T1", 
     "rcdTypCd"="Y1", 
     "rcdTypCd"="U1", 
     "rcdTypCd"="I1", 
     "rcdTypCd"="O1", 
     "rcdTypCd"="P1") 
    //list type is Iterable[string] 
    val multiM = new HashMap[String, Set[String]] with MultiMap[String, String] 
     list.foreach { case (key, value) => multiM.addBinding(key, value) } 
    println(multiM) 
    }} 

sortie doit être comme ci-dessous

val mymap= Map(rcdTypCd->Q1, 
    rcdTypCd->W1, 
    rcdTypCd->E1, 
    rcdTypCd->R1, 
    rcdTypCd->T1, 
    rcdTypCd->Y1, 
    rcdTypCd->U1, 
    rcdTypCd->I1, 
    rcdTypCd->O1, 
    rcdTypCd->P1) 

Chaque fois que je vais appeler la clé (rcdTypCd), il imprime toutes les valeurs correspondu

println(key) 

elle imprime toutes les valeurs comme ci-dessous

Q1,W1,E1,R1,T1,Y1,U1,I1,O1,P1 
+0

Pouvez-vous expliquer mieux les types de la rcdTypCd et les valeurs – dirceusemighini

+0

@dirceusemighini, rcdTypCd est alpha-numérique. –

Répondre

1

Peut-être la MultiMap collection mutable vous aidera:

import scala.collection.mutable{ HashMap, Set, MultiMap } 

// I assumed you have a list of tuples 
val list = List(
    "rcdTypCd" -> "Q1", 
    "rcdTypCd" -> "W1", 
    "rcdTypCd" -> "P1" 
) 

val mm = new HashMap[String, Set[String]] with MultiMap[String, String] 
list.foreach { case (key, value) => mm.addBinding(key, value) } 

println(mm) // Map(rcdTypCd -> Set(Q1, W1, P1)) 

Juste être prudent avec les importations, que vous avez besoin des collections mutables ici. Et assurez-vous de vérifier le docs.

+0

Andrei T, merci pour votre relecture, j'obtiens cette erreur: constructeur (X, X) ne peut pas être instancié au type attendu; trouvé: (T1, T2) requis: Chaîne sl.foreach {case (clé, valeur) => mm.addBinding (clé, valeur)} –

+0

Pourriez-vous s'il vous plaît modifier votre code actuel? Ou poster le ici? J'ai besoin de le voir pour vous aider –

+0

S'il vous plaît voir le code mis à jour. –

0

Utilisez foldLeft si vous voulez le faire fonctionnellement:

import scala.collection.immutable.Map 

    val original = List("sd=sdf") 

    original.foldLeft(Map[String, String]()) ((accumulatedValue: Map[String, String], str: String) => { 
    val array: Array[String] = str.split("=") 
    val newMap: Map[String, String] = accumulatedValue + (array(0) -> array.last) 
    newMap 
    }) 

Comme son nom l'indique, se replie foldLeft la liste en une seule valeur à partir du côté gauche de la liste.

foldLeft est une fonction au curry. Le premier paramètre que vous passez est appelé la graine et vous pouvez considérer cela comme le point de départ de votre pli. Le deuxième paramètre est une fonction qui prend deux paramètres (la valeur accumulée dans le pli et un élément de la liste) et renvoie une nouvelle valeur à utiliser dans l'itération suivante du pli. Les types sont épelés pour le rendre plus clair.

+0

J'ai essayé ci-dessus ensemble de code et il retourne une seule clé et valeur comme cette carte (rcdTypCd-> U1). –