我有一个ArrayBuffer,其数据格式如下:period_name:character different(15)year:bigint。其中的数据表示表的列名及其数据类型。我的要求是提取列名的句点和数据类型,只是从“(”到“)”中除去子字符串之外的字符变化,然后将所有元素发送到ListBuffer。我想出了以下逻辑:
for(i <- receivedGpData) {
gpTypes = i.split("\\:")
if(gpTypes(1).contains("(")) {
gpColType = gpTypes(1).substring(0, gpTypes(1).indexOf("("))
prepList += gpTypes(0) + " " + gpColType
} else {
prepList += gpTypes(0) + " " + gpTypes(1)
}
}
上面的代码正在工作,但是我正在尝试使用Scala的Map和Filter函数实现相同的功能。我不明白的是在条件之后如何在Scala过滤器中使用if-else条件:
var reList = receivedGpData.map(element => element.split(":"))
.filter{ x => x(1).contains("(")
}
有人可以让我知道如何使用Scala的map&filter函数在for循环中实现相同的代码吗?
答案 0 :(得分:1)
val receivedGpData = Array("bla:bla(1)","bla2:cat")
val res = receivedGpData
.map(_.split(":"))
.map(s=>(s(0),s(1).takeWhile(_!='(')))
.map(s => s"${s._1} ${s._2}").toList
println(res)
答案 1 :(得分:1)
使用正则表达式:
val p = "(\\w+):([.[^(]]*)(\\(.*\\))?".r
val res = data.map{case p(x,y,_)=>x+" "+y}
在Scala REPL中:
scala> val data = Array("period_name:character varying(15)","year:bigint")
data: Array[String] = Array(period_name:character varying(15), year:bigint)
scala> val p = "(\\w+):([.[^(]]*)(\\(.*\\))?".r
p: scala.util.matching.Regex = (\w+):([.[^(]]*)(\(.*\))?
scala> val res = data.map{case p(x,y,_)=>x+" "+y}
res: Array[String] = Array(period_name character varying, year bigint)