List 如何使用不同的数据类型拆分要添加到Scala中映射的列表
我有一些原始测试数据,我需要将其拆分为一个格式图: 映射[String,List[Int,String,Float]] 我已设法将数据作为列表读取,并将在下面给出一行数据的示例: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 上面
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)))