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

Mik*_*378 2 scala

假设String:Point(123 456).

什么是一个有效和干净的方式来提取和分配123456(as String)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)
Run Code Online (Sandbox Code Playgroud)

蛮丑的 ...

Rex*_*err 5

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

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

在我的机器上,使用这种方法提取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))
}
Run Code Online (Sandbox Code Playgroud)

这样更快:我机器上的10k为0.38 ms.