使用space作为填充字符,制作一个正确调整的字符串列表

时间:2018-02-12 02:23:46

标签: string scala list higher-order-functions

我的目标是使用空格作为填充字符来制作正确调整的字符串列表。

输入是List(可以是数字列表或字符串列表),输出是正确调整的字符串列表。

我的实现如下:

def rightJustify(width: Int)(str: String): String = {
  require(str.length < w)
  List.fill(width - str.length)(' ').mkString + str
}

def makeStrs[T](lst: List[T], useValue: Boolean): List[String] = {
  if (useValue) lst.map(x => rightJustify(5)(x.toString))
  else          lst.map(_ => rightJustify(5)("")) //Just make several space characters
}

//test code
def makeListStrs: List[String] = {
  val header = List("Car", "Cat", "Dog")
  val useValue = true
  makeStrs(header, useValue) ++ // a bunch of strings
    makeStrs((1 to 5).toList, !useValue) ++ // a bunch of spaces 
    makeStrs((1 to 15).toList, useValue) ++  // a bunch of numbers
    makeStrs((1 to 5).toList, !useValue)   //a bunch of spaces
}

代码有效,但我不确定函数makeStrs是否可以更简洁。 任何提示都表示赞赏。

2 个答案:

答案 0 :(得分:2)

是的,我认为更简洁是可能的。

def makeStrs[T](lst: List[T], useValue: Boolean): List[String] =
  if (useValue) lst.map(x => f"$x%5s")
  else          lst.map(_ => " "*5)

答案 1 :(得分:2)

@ jwvh的解决方案涉及优化同时考虑的makeStrsrightJustify非常好。但是,我们也只考虑makeStrs

你的makeStrs已经很短了,在现实生活中,我可能只是让重复过去了。但是当涉及更多代码时,消除重复变得更具吸引力。

这是减少重复的一种方法:

def makeStrs[T](lst: List[T], useValue: Boolean): List[String] = {
  lst.map(x => rightJustify(5)(
    if (useValue) x.toString
    else "")

另一个:

def makeStrs[T](lst: List[T], useValue: Boolean): List[String] = {
  val formatter: T => String =
    if (useValue) _.toString
    else _ => ""
  lst.map(x => rightJustify(5)(formatter(x)))
}

第二个更长,但我认为仍然值得深思。它只检查useValue一次,我喜欢。不是因为对效率的关注,而是因为我认为再次检查清楚地与问题的结构相匹配。

我也不理解你的问题。有时,Stack Overflow对新手来说非常困难。