以不同方式打印List的元素

时间:2013-11-27 14:51:29

标签: list scala tostring

我需要使用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

提前致谢。

4 个答案:

答案 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
}