在Scala中的List中创建空白区域

时间:2018-06-01 03:13:33

标签: scala list lambda functional-programming

我正在尝试将字符串列表转换为表格" rBrrBB"或" r rb"或" RRB&#34 ;.该字符串必须具有长度6.如果此列表未满,则该列表应以适当数量的空格为前缀

到目前为止我的代码如下

  

def showColumn(xs:List [String]):String = xs match
   {case List()=> ""     case x :: xs1 => x.format("")+ showColumn(xs1)}

当我从

打电话时
  

println(showColumn(List("",""," b"," b"," r& #34;" b")))

它只返回" bbrb"。它假设返回" BBRB" 任何帮助都会很感激。

1 个答案:

答案 0 :(得分:3)

试试这个:

def showColumn(xs: List[String]): String = xs.map(x => if(x == "") " " else x).mkString

或者,或者:

def showColumn(xs: List[String]): String = xs.map(x => if(x.isEmpty) " " else x).mkString

两者都可以通过将列表中的空字符串更改为空格,然后将列表中的每个字符串合并为单个字符串。

如果你绝对必须使它成为一个递归函数,那么一个非尾递归的解决方案将如下所示:

def showColumn(xs: List[String]): String = xs match {
  case Nil => ""
  case x :: xs1 => (if(x.isEmpty) " " else x) + showColumn(xs1)
}

最后, tail-recursive 版本稍微复杂一些,因为它使用了一个辅助函数:

import scala.annotation.tailrec

def showColumn(xs: List[String]): String = {

  // Tail recursive helper function.
  @tailrec
  def nextStr(rem: List[String], acc: String): String = rem match {
    case Nil => acc
    case x :: xs1 => nextStr(xs1, acc + (if(x.isEmpty) " " else x))
  }

  // Start things off.
  nextStr(xs, "")
}