我的目标是使用空格作为填充字符来制作正确调整的字符串列表。
输入是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
是否可以更简洁。
任何提示都表示赞赏。
答案 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的解决方案涉及优化同时考虑的makeStrs
和rightJustify
非常好。但是,我们也只考虑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对新手来说非常困难。