假设String
:Point(123 456)
。
将123
和456
(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)
非常难看......
答案 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))