【问题标题】:Printing element of List in a different way以不同的方式打印 List 的元素
【发布时间】:2013-11-27 14:51:28
【问题描述】:

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

提前致谢。

【问题讨论】:

  • A List[List[Int]],还是别的什么?
  • 我编辑了我的问题。

标签: list scala tostring


【解决方案1】:

只需在其中放一张额外的地图,将 0 更改为 _

grid.map(_.map(_ match {case 0 => "_"; case x => x}).mkString(" ")).mkString("\n")

【讨论】:

  • 能否解释一下这部分发生了什么:.map( match {case 0 => "_"; case x => x}
  • 对于 List[Int] 中的每个项目,您都在与整数文字 0 进行模式匹配。当它匹配时,您将该条目映射到字符串“_”。对于所有其他值(与占位符 x 匹配的值),只需将它们映射到它们的原始值。
  • 使用.map{ case 0 => "_"; case x => x }会更简洁(省略_ match部分)
  • 谢谢,看起来更干净了
【解决方案2】:

没什么特别的:

def toString(xs: List[List[Int]]) = xs.map { ys => 
    ys.map { 
        case 0 => "_"
        case x => String.valueOf(x)
    }.mkString(" ")
}.mkString("\n")

【讨论】:

  • x.toString 在我看来更好看
【解决方案3】:

虽然其他解决方案在功能上是正确的,但我相信这更清楚地表明了发生了什么,因此更适合初学者:

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 元素都是

我们获取网格的每一行,通过我们的转换方法运行该行中的每个数字,并将生成的字符组合成一个字符串。

然后,我们将生成的行字符串转换为最终字符串。

整个内容可以写得更短,但不一定更具可读性。

在本例中使用像 replaceZero 这样的小型内部方法也是一种很好的 Scala 风格,而不是内联编写所有代码,因为方法的命名有助于指示它的作用,并且这样可以提高可读性。

【讨论】:

  • 非常感谢您的解释。能否解释一下这部分:i.toString charAt 0
  • toString 简单的转弯,例如5 转换成字符串“5”。 (注意双标记。)我们可以使用它,它的工作原理是一样的,但是在这里使用 Char 更优雅一点,因为所有元素都将表示为单个字符,例如'5'(注意单标记)。 charAtString 类的一个方法。你可以在这里查看 API docs.oracle.com/javase/7/docs/api 看看它做了什么
【解决方案4】:

总是有其他解决方案的余地。 ;-)

一个网格:

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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    相关资源
    最近更新 更多