List 如何使用不同的数据类型拆分要添加到Scala中映射的列表

List 如何使用不同的数据类型拆分要添加到Scala中映射的列表,list,scala,dictionary,functional-programming,List,Scala,Dictionary,Functional Programming,我有一些原始测试数据,我需要将其拆分为一个格式图: 映射[String,List[Int,String,Float]] 我已设法将数据作为列表读取,并将在下面给出一行数据的示例: Oor Wullie Route (GCU),1:City Chambers:0.75f,2:Sir Chris Hoy Velodrome:3.8f,3:People's Palace:2.7f,4:Riverside Museum:5.4f,5:Botanic Gardens:2.4f,6:GCU:3.4f 上面

我有一些原始测试数据,我需要将其拆分为一个格式图:

映射[String,List[Int,String,Float]]

我已设法将数据作为列表读取,并将在下面给出一行数据的示例:

Oor Wullie Route (GCU),1:City Chambers:0.75f,2:Sir Chris Hoy Velodrome:3.8f,3:People's Palace:2.7f,4:Riverside Museum:5.4f,5:Botanic Gardens:2.4f,6:GCU:3.4f
上面表示以下内容:路线、阶段编号:阶段名称:阶段总距离

因此,每组3个值,即1:City Chambers:5,应添加到地图的[Int,String,Float]部分,路径名称为键

这是我到目前为止读取文件并将其添加到列表的代码:

var mapBuffer: Map[String, List[(Int, String, Float)]] = Map()

val fitnessData = "C:\\Users\\josep\\Desktop\\Coursework\\Coursework\\src\\cw.txt"

val lines = Source.fromFile("C:\\Users\\josep\\Desktop\\Coursework\\Coursework\\src\\cw.txt").getLines.toList
我想编写一个函数,用于将数据拆分并添加到地图,基本上是这样做的:

var key ="Oor Wullie Route (GCU)"
var newList = List((1,"City Chambers",0.75f),(2,"Sir Chris Hoy Velodrome",3.8f),(3,"People's Palace",2.7f),(4,"Riverside Museum",5.4f),(5,"Botanic Gardens",2.4f),(6,"GCU",3.4f))
mapBuffer = mapBuffer ++ Map(key -> newList)

如何将数据以所需格式添加到地图中?

我的建议是使用foldLeft。比如:

  val resource = Source.fromFile("src/lines.txt")
  val lines = resource.getLines.toList
  resource.close()

  val map = lines.foldLeft(Map[String, List[(Int, String, Float)]]())((map, line) => {
    val keyValuesArray = line.split(",").toList
    val key = keyValuesArray.head
    val listOfValuesAsString = keyValuesArray.tail

    val listOfValues = listOfValuesAsString.map {
      case s"$integer:$string:$float" => (integer.toInt, string, float.toFloat)
    }

    map + (key -> listOfValues)
  })
从空映射开始,为每行添加键->值。 另外,当你们解析listOfValues列表中的数据时,试着匹配表达式。这种方法使用模式匹配和尾部递归。 我认为它工作得很好

首先,我将文件转换为列表[Array[String]]

其次,我调用loop以递归方式遍历列表并构建映射

第三,在循环函数中,我调用makelist以递归方式构建元组列表

例如:

输入

代码

导入scala.io.Source 对象转换映射{ @注释.tailrec def makeListlst:List[String],acc:List[Int,String,Float]:List[Int,String,Float]={ lst匹配{ 案例无=>acc 案例h::t=>{ val数据=h.split: val tuple=data0.toInt,data1,data2.substring0,data2.length-1.toFloat makeListt,tuple::acc } } } @注释.tailrec def looplst:List[Array[String]],acc:Map[String,List[Int,String,Float]]:Map[String,List[Int,String,Float]={ lst匹配{ 案例无=>acc 案例h::t=>{ val键=h0 val lTuple=makeListh.toList.tail,列表 ifacc.containskey loopt,acc else loopt,Mapkey->lTuple++acc } } } def mainargs:数组[字符串]:单位={ val fitnessData=/home/cloudera/files/tests/to_map.csv val lines=Source.fromFilefitnessData .getLines 托利斯先生 .mapline=>line.split, val mp=回路线,映射 printlnmp } } 预期结果


您需要检查mapBuffer中是否已经存在does键,并将mapBuffer中的列表和新列表连接起来。
Oor Wullie Route (GCU),1:City Chambers:0.75f,2:Sir Chris Hoy Velodrome:3.8f,3:People's Palace:2.7f,4:Riverside Museum:5.4f,5:Botanic Gardens:2.4f,6:GCU:3.4f
Oor Wullie Route2 (GCU),1:City Chambers:0.75f,2:Sir Chris Hoy Velodrome:3.8f,3:People's Palace:2.7f,4:Riverside Museum:5.4f,5:Botanic Gardens:2.4f,6:GCU:3.4f
Oor Wullie Route3 (GCU),1:City Chambers:0.75f,2:Sir Chris Hoy Velodrome:3.8f,3:People's Palace:2.7f,4:Riverside Museum:5.4f,5:Botanic Gardens:2.4f,6:GCU:3.4f
Map(Oor Wullie Route3 (GCU) -> List((6,GCU,3.4), (5,Botanic Gardens,2.4), (4,Riverside Museum,5.4), (3,People's Palace,2.7), (2,Sir Chris Hoy Velodrome,3.8), (1,City Chambers,0.7)), 
    Oor Wullie Route2 (GCU) -> List((6,GCU,3.4), (5,Botanic Gardens,2.4), (4,Riverside Museum,5.4), (3,People's Palace,2.7), (2,Sir Chris Hoy Velodrome,3.8), (1,City Chambers,0.7)), 
    Oor Wullie Route (GCU) -> List((6,GCU,3.4), (5,Botanic Gardens,2.4), (4,Riverside Museum,5.4), (3,People's Palace,2.7), (2,Sir Chris Hoy Velodrome,3.8), (1,City Chambers,0.7)))