List 以不同的方式打印列表元素
我需要使用Scala和函数toString打印一个列表列表,其中0的每一次出现都需要替换为一个“\u0”。这是我迄今为止的尝试。注释代码表示我的不同尝试List 以不同的方式打印列表元素,list,scala,tostring,List,Scala,Tostring,我需要使用Scala和函数toString打印一个列表列表,其中0的每一次出现都需要替换为一个“\u0”。这是我迄今为止的尝试。注释代码表示我的不同尝试 override def toString() = { // grid.map(i => if(i == 0) '_' else i) // grid map{case 0 => '_' case a => a} // grid.updated(0, "_") //grid.map{ case
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更改为_
grid.map(_.map(_ match {case 0 => "_"; case x => x}).mkString(" ")).mkString("\n")
没什么特别的:
def toString(xs: List[List[Int]]) = xs.map { ys =>
ys.map {
case 0 => "_"
case x => String.valueOf(x)
}.mkString(" ")
}.mkString("\n")
虽然其他解决方案在功能上是正确的,但我相信这更明确地说明了发生了什么,因此更适合初学者:
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风格,因为方法的命名有助于指示它的功能,并因此提高了可读性。总有其他解决方案的空间。;-)
网格:
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
}
用于(第“\u1”行)
case anything=>anything
}
List[List[Int]]或其他什么?我编辑了我的问题。是否可以解释这一部分中发生的情况:.map(匹配{case 0=>“_”;case x=>x}对于列表[Int]中的每个项目,模式匹配整数文本0。当它匹配时,将该条目映射到字符串“_”。对于所有其他值(那些匹配占位符x的)只需将它们映射到它们的原始值。使用.map{case 0=>“25;”case x=>x}
(省略\match
部分)会更简洁谢谢,它看起来更干净。x.toString
在我看来看起来更好。谢谢你的解释。能解释一下这部分吗:i.toString字符0将简单的转换,例如5转换成字符串“5”。(注意双号。)我们可以使用它,它的工作原理是一样的,但是在这里使用Char更优雅一些,因为所有元素都将表示为单个字符,例如“5”(注意单个标记)。charAt
是String
类上的一个方法。您可以在这里查找API以了解它的功能