在String中提取和赋值的有效方法是什么?

时间:2014-08-21 20:35:39

标签: scala

假设StringPoint(123 456)

123456String)一次提取并分配给Tuple2会有效且干净的方法是什么?

我做了什么:

val str = "Point(123 456)"
val tab = str.stripPrefix("Point(").stripSuffix(")").split("\\s")
val tuple2 = (tab(0), tab(1))
println(tuple2)  // displays the (123,456)

非常难看......

2 个答案:

答案 0 :(得分:5)

最直接的方法是使用正则表达式提取器。实际上,对于像这样简单的东西来说,这些速度非常快 - 与解决方案一样快。它更漂亮吗?我不知道。

val p = """Point\((\d+)\s(\d+)\)""".r
"Point(123 456)" match { case p(a,b) => (a,b) }

在我的机器上,使用此方法提取10,000个这样的对需要3.90毫秒,使用你的方法需要4.35毫秒(主要是由于split的额外缓慢)。

如果由于某些奇怪的原因你需要它更快,

def uuple2(s: String) = {
  if (!s.startsWith("Point(") || s(s.length-1) != ')') throw new Exception
  val i = s.indexOf(' ',6)
  if (i < 0 || i+2 >= s.length) throw new Exception
  (s.substring(6,i), s.substring(i+1,s.length-1))
}

速度更快:我机器上的10k为0.38 ms。

答案 1 :(得分:4)

您可以使用正则表达式:

val str = "Point(123 456)"
val re = """Point\((\d+) (\d+)\)""".r

val re(f, s) = str
println((f, s))