我有一个字符串列表,如下所示,其中列出了水果和与每个字符串相关的成本。如果没有值,则假定为5:
val stringList: List[String] = List("apples 20", "oranges", "pears 10")
现在我想分割字符串以获得水果和成本的元组。 scala的做法是什么?
stringList.map(query => query.split(" "))
不是我想要的。
I found this类似。 Scala的正确方法是什么?
答案 0 :(得分:3)
您可以使用正则表达式和模式匹配:
val Pat = """(.+)\s(\d+)""".r // word followed by whitespace followed by number
def extract(in: String): (String, Int) = in match {
case Pat(name, price) => (name, price.toInt)
case _ => (in, 5)
}
val stringList: List[String] = List("apples 20", "oranges", "pears 10")
stringList.map(extract) // List((apples,20), (oranges,5), (pears,10))
模式中有两个捕获组。这些将被提取为字符串,因此您必须使用.toInt
显式转换。
答案 1 :(得分:3)
你几乎拥有它:
stringList.map(query => query.split(" "))
是你想要的,只需添加另一个地图就可以将列表更改为元组:
.map { list => list.head -> list.lift(1).getOrElse("5").toInt }
或者相反,如果您愿意:
.collect {
case Seq(a, b) => a -> b.toInt
case Seq(a) => a -> 5
}
(.collect
将默默忽略列表中少于一个或多于两个元素的事件。如果您希望通过错误,可以将其替换为.map
这样的情况)。