在地图中建立堆栈

The*_*aul 1 string stack split scala scala-2.8

我有一个看起来像这样的字符串:

 "7-6-4-1"
Run Code Online (Sandbox Code Playgroud)

要么

 "7"
Run Code Online (Sandbox Code Playgroud)

要么

 ""
Run Code Online (Sandbox Code Playgroud)

也就是说,一组数字用 - 分隔.可能有零个或多个数字.

我想返回一个堆栈,其中按顺序按下数字(即第一个按7,第一个示例为1个)

如果我只是想返回一个列表,我可以去str.split("-").map{_.toInt}(虽然这对空字符串不起作用)/

虽然没有toStack转换为Stack.所以目前,我有

  {
    val s = new Stack[Int]; 
    if (x.nonEmpty)
        x.split('-').foreach {
    y => s.push(y.toInt)
      }
   s
   }
Run Code Online (Sandbox Code Playgroud)

哪个有效,但非常难看.我错过了什么?

编辑:感谢所有响应者,我从这次讨论中学到了很多东西

Rex*_*err 5

Stack(x.split("-").map(_.toInt).reverse: _*)
Run Code Online (Sandbox Code Playgroud)

这里的技巧是将你从split获得的数组传递给Stack伴随对象构建器.默认情况下,项目的顺序与数组的顺序相同,因此您必须先反转数组.

请注意"将此视为列表,而不是单个项目"注释: _*.


编辑:如果你不想单独捕获空字符串的情况,就像这样(使用底部的一个用于可变堆栈,顶部用于不可变的):

if (x.isEmpty) Stack() else Stack(x.split("-").map(_.toInt).reverse: _*)
if (x.isEmpty) Stack[Int]() else Stack(x.split("-").map(_.toInt).reverse: _*)
Run Code Online (Sandbox Code Playgroud)

然后你可以过滤掉空字符串:

Stack(x.split("-").filterNot(_.isEmpty).map(_.toInt).reverse: _*)
Run Code Online (Sandbox Code Playgroud)

这也将"帮助"处理像7-9----2-2-4你这样的东西(它会给予Stack(4,2,2,9,7)).

如果你想处理更糟糕的格式化错误,你可以

val guard = scala.util.control.Exception.catching[Int](classOf[NumberFormatException])
Stack(x.split("-").flatMap(x => guard.opt(x.toInt)).reverse: _*)
Run Code Online (Sandbox Code Playgroud)

仅返回实际可以解析的项目.