Создание пустого пространства в списке в Scala - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь преобразовать список строк в форму "rBrrBB", или "rr rb", или "rrB".Строка должна иметь длину 6. Если этот список не полный, то перед списком должен стоять соответствующий номер пробела

Пока мой код, как показано ниже

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

когда я вызываю это из

println (showColumn (List ("", "", "b", "b", "r", "b")))

возвращает только "bbrb".Предполагается, что возвращать "bbrb" Любая помощь будет признательна.

1 Ответ

0 голосов
/ 01 июня 2018

Попробуйте это:

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

Оба работают, заменяя пустые строки в списке на пробелы, затем объединяя каждую строку в списке в одинstring.

Если вам абсолютно необходимо сделать эту функцию рекурсивной, то решение, не являющееся хвост-рекурсивным , будет выглядеть так:

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

Наконец, хвостовая рекурсия версия немного сложнее, так как использует вспомогательную функцию:

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, "")
}
...