用于嵌套数组的 Scala 递归打印函数



我正在尝试编写一个可以打印任意嵌套数组的辅助方法。我的计划是编写一个递归方法来解决这个问题。我想使用键入来区分要调用的方法。

基本情况是打印一个包含值的数组,即不是另一个嵌套数组。

递归情况是,如果数组包含另一个数组,则在子数组上调用 print。

这是我想写的代码

object Helper {
  // Takes something that is an array of arrays and prints it
  def print[B <: Array[Array[AnyVal]]](data: B): Unit = {
    val sb = new StringBuilder()
    printSb(data, sb)
    println(sb.toString())
  }
  // Same as above but with string builder
  private def printSb[B <: Array[Array[_]]](data: B, sb: StringBuilder): Unit = {
    data.foreach(arr => printSb(arr, sb))
  }
  // Prints a value
  def print[B <: AnyVal](data: Array[B]): Unit = {
    val sb = new StringBuilder()
    printSb(data, sb)
    println(sb.toString())
  }
  // Prints an Array of values, not an array or arrays
  private def printSb[B <: AnyVal](data: Array[B], sb: StringBuilder): Unit = {
    data.foreach(b => "%s ".format(sb.append(printVal(b))))
  }
  // Prints a value
  def printVal(v: Any): String = {
    v match {
      case b: Boolean => if (b) "1" else "0"
      case i: Integer => "%01d".format(i)
      case v => v.toString
    }
  }
}

但是,编译器很难决定将方法调用调度到哪个打印(我认为是因为 AnyVal == Array[_] ???(。我正在寻找一种通过类型表达我要求的好方法,这可能吗?

在我看来,你正在使它变得比它需要的更复杂。

从简单的事情开始...

def stringAll[X](x :X) :String = x match {
  case arr: Array[_] => arr.map(stringAll).mkString("["," ","]")
  case _ => x.toString
}

。那行得通...

val a = Array(Array(Array(2,5),Array('c','t')))
stringAll(a)  //res0: String = [[[2 5] [c t]]]

。并根据需要添加更花哨的变换case b:Boolean => ...

最新更新