Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 以不同的方式打印列表元素_List_Scala_Tostring - Fatal编程技术网

List 以不同的方式打印列表元素

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

我需要使用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 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以了解它的功能