2017-04-10 9 views
0

私はScalaの初心者ですが、私は以下のようなリストを持っていてmap.Iに変換したいのですが、MultiMapで試してみましたが、目標を達成することができません。出力はリストをスカラーのマルチマップに変更するには?

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

私はキー(rcdTypCd)を呼び出しますたびに、それはすべて、対応付けられた値

println(key) 

を印刷します、それは以下のようなすべての値を出力し、以下のようにする必要があり

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) 
    }} 

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

rcdTypCdのタイプと値をよりよく説明できますか? – dirceusemighini

+0

@dirceusemighini、rcdTypCdは英数字です。 –

答えて

1

たぶんMultiMap可変コレクションがお手伝いします:

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

あなたがここに可変コレクションを必要とするだけ、輸入品に注意してください。そしてdocsを必ずチェックしてください。

+0

Andrei Tさん、再生していただきありがとうございます。このエラーが発生しました:(X、X)コンストラクタは、予想されるタイプにインスタンス化できません。 が見つかりました:(T1、T2) 必須:文字列 sl.foreach {case(key、value)=> mm.addBinding(key、value)} –

+0

現在のコードを編集してください。またはここに投稿しますか?私はそれを参照する必要があります –

+0

更新されたコードを参照してください。 –

0

使用foldLeftあなたが機能的にそれをしたい場合:

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 
    }) 

名前が示すように、foldLeftは、リストの左側から始まる1つの値にリストを折ります。

foldLeftはカレー関数です。渡す最初のパラメータはシードと呼ばれ、これを折り畳みの開始点と考えることができます。 2番目のパラメータは、2つのパラメータ(折りたたみ全体の累積値とリストの要素)を取得し、折り返しの次の繰り返しで使用する新しい値を返す関数です。タイプは明確にするために綴られています。

+0

私は上記のコードセットを試して、このMap(rcdTypCd-> U1)のように1つのキーと値しか返しません。 –

関連する問題