我需要使用Scala和函数toString打印列表列表,其中每次出现的0都需要用'_'替换。这是我到目前为止的尝试。评论的代码代表了我的不同尝试。
override def toString() = {
// grid.map(i => if(i == 0) '_' else i)
// grid map{case 0 => '_' case a => a}
// grid.updated(0, "_")
//grid.map{ case 0 => "_"; case x => x}
grid.map(_.mkString(" ")).mkString("\n")
}
我的输出应该看起来像这样,但是下划线而不是零
0 0 5 0 0 6 3 0 0
0 0 0 0 0 0 4 0 0
9 8 0 7 4 0 0 0 5
1 0 0 0 7 0 9 0 0
0 0 9 5 0 1 6 0 0
0 0 8 0 2 0 0 0 7
6 0 0 0 1 8 0 9 3
0 0 1 0 0 0 0 0 0
提前致谢。
答案 0 :(得分:1)
只需在其中添加一个额外的地图即可将0更改为_
grid.map(_.map(_ match {case 0 => "_"; case x => x}).mkString(" ")).mkString("\n")
答案 1 :(得分:1)
没什么特别的:
def toString(xs: List[List[Int]]) = xs.map { ys =>
ys.map {
case 0 => "_"
case x => String.valueOf(x)
}.mkString(" ")
}.mkString("\n")
答案 2 :(得分:0)
虽然其他解决方案在功能上是正确的,但我相信这更明确地显示了会发生什么,因此更适合初学者:
def gridToString(grid: List[List[Int]]): String = {
def replaceZero(i: Int): Char =
if (i == 0) '_'
else i.toString charAt 0
val lines = grid map { line =>
line map replaceZero mkString " "
}
lines mkString "\n"
}
首先,我们定义一种将数字转换为字符的方法,用下划线替换零。 (从您的示例中假设所有Int元素都是< 10。)
我们获取网格的每一行,通过我们的转换方法运行该行中的每个数字,并将生成的字符组合成一个字符串。
我们采取生成的线串并将它们转换为最终的字符串。
整个事情可以写得更短,但它不一定更具可读性。
在此示例中使用小内部方法(如replaceZero
)而不是内联编写所有代码也是一种很好的Scala样式,因为方法的命名有助于指示它的作用,因此提高了可读性。
答案 3 :(得分:0)
总有另一个解决方案的空间。 ; - )
网格:
type Grid[T] = List[List[T]]
打印网格:
def print[T](grid: Grid[T]) = grid map(_ mkString " ") mkString "\n"
替换所有零:
for (row <- grid) yield row.collect {
case 0 => "_"
case anything => anything
}