如何在scala中将列表更改为多重映射?

如何在scala中将列表更改为多重映射?,scala,multimap,Scala,Multimap,我是Scala的新手,我有一个如下的列表,我想转换成地图。我尝试过使用MultiMap,但我无法实现我的目标。任何帮助都是值得的 object Mapis{ def main(args: Array[String]) { val list= ("rcdTypCd"="Q1", "rcdTypCd"="W1", "rcdTypCd"="E1", "rcdTypCd"="R1", "rcdTypC

我是Scala的新手,我有一个如下的列表,我想转换成地图。我尝试过使用MultiMap,但我无法实现我的目标。任何帮助都是值得的

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)
    }}
输出应如下所示

   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)
它打印所有值,如下所示

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

也许
MultiMap
mutable集合将帮助您:

import scala.collection.mutable{HashMap,Set,MultiMap}
//我假设你有一个元组列表
val list=列表(
“rcdTypCd”->“Q1”,
“rcdTypCd”->“W1”,
“rcdTypCd”->“P1”
)
val mm=新的HashMap[String,Set[String]]和MultiMap[String,String]
list.foreach{case(key,value)=>mm.addBinding(key,value)}
println(mm)//映射(rcdTypCd->Set(Q1,W1,P1))

只需小心导入,因为这里需要可变集合。如果您想在功能上使用foldLeft,请务必查看。

使用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
从列表左侧开始将列表折叠为一个值


foldLeft
是一个通用函数。您传入的第一个参数称为种子,您可以将其视为折叠的起点。第二个参数是一个函数,它接受两个参数(整个折叠的累积值和列表中的一个元素),并返回一个新值以在折叠的下一次迭代中使用。类型的拼写更清晰。

您能更好地解释rcdTypCd和values@dirceusemighini,rcdTypCd是字母数字的。Andrei T,感谢您的重播,我收到了以下错误:(X,X)构造函数无法实例化为预期类型;找到:(T1,T2)必需:String sl.foreach{case(key,value)=>mm.addBinding(key,value)}请编辑当前代码好吗?或者把它贴在这里?我需要看看它来帮助你你实际上弄错了列表定义,因为那不是一个有效的语法。尝试类似于
vallist=list(“A”->“B”,“C”->“D”)
。或者,如果您的列表中有类似于
list(“A=B”、“C=D”)
的字符串,那么就执行
list.map(u.split(“=”,2)).foreach{case数组(key,value)=>multiM.addBinding(key,value)}
我已经尝试了上述代码集,它只返回一个键和值,就像这个map(rcdTypCd->U1)一样。