在scala中使用默认值拆分字符串

时间:2016-04-25 19:49:54

标签: scala tuples default-value

我有一个字符串列表,如下所示,其中列出了水果和与每个字符串相关的成本。如果没有值,则假定为5:

val stringList: List[String] = List("apples 20", "oranges", "pears 10")

现在我想分割字符串以获得水果和成本的元组。 scala的做法是什么?

stringList.map(query => query.split(" ")) 

不是我想要的。

I found this类似。 Scala的正确方法是什么?

2 个答案:

答案 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这样的情况)。