Scala表格打印

Scala表格打印,scala,Scala,我是斯卡拉的新手。我想找出一种打印imuutable数据的方法,它是一个映射,其中键是字符串的元组,值是双精度的: Map( ("ZZ1", "A") -> 3.5, ("ZZ2", "C") -> 2.3, ("ZZ3", "D") -> 2.8, ("ZZ1", "D") -> 3.0, ("ZZ2", "D") -> 5.9 ) 这样做的目的是得到一个类似于一个充满零的表格的打印结果,其中没有任何值(下图中的示例) 如何才能避免循环 提前感谢根据

我是斯卡拉的新手。我想找出一种打印imuutable数据的方法,它是一个映射,其中键是字符串的元组,值是双精度的:

Map(
 ("ZZ1", "A") -> 3.5,
 ("ZZ2", "C") -> 2.3,
 ("ZZ3", "D") -> 2.8,
 ("ZZ1", "D") -> 3.0,
 ("ZZ2", "D") -> 5.9
)
这样做的目的是得到一个类似于一个充满零的表格的打印结果,其中没有任何值(下图中的示例)

如何才能避免循环


提前感谢

根据您的数据结构,您可以按元组的第一列进行分组,然后手动提取值,如下所示

您有一个循环要分组(内部循环要迭代分组值,这意味着
O(n^2)
),循环要迭代每个值以打印(
O(n)

结果:

      A      B       C       D
ZZ1 3.5     0.0     0.0     3.0
ZZ3 0.0     0.0     0.0     2.8
ZZ2 0.0     0.0     2.3     5.9

下面是一个运行示例-

可能是这样的吗

val data = Map(
 ("ZZ1", "A") -> 3.5,
 ("ZZ2", "C") -> 2.3,
 ("ZZ3", "D") -> 2.8,
 ("ZZ1", "D") -> 3.0,
 ("ZZ2", "D") -> 5.9
)

val (rows, cols) = {
  val (r, c) = data.keys.unzip
  (r.toList.sorted, c.toList.sorted)
}

val table = 
  ("" +: cols).map("%5s".format(_)).mkString + "\n" +
  rows.map { r =>
    "%5s".format(r) + cols.map { c =>
      " %4.1f".format(data.getOrElse((r, c), 0.0))
    }
    .mkString
  }.mkString("\n")

println(table)
给出:

         A    C    D
  ZZ1  3.5  0.0  3.0
  ZZ2  0.0  2.3  5.9
  ZZ3  0.0  0.0  2.8

我没有试图让所有的空间看起来与图中完全一样,有更好的工具(TeX、CSS)。

你说的“避免循环”是什么意思?迭代键的(部分)是不可避免的,真的(到目前为止,答案中的“映射”是一个循环,真的)很好,它没有假设键中的值,但与规范(没有B列)不匹配@TheArchetypalPaul什么“规范”?所需输出的图像不算作“规格”。如果您希望任何列名甚至不出现在输入数据中,那么您必须显式地提供它们-可以随意将
的定义更改为比实际存储在变量
数据
中的数据更有趣的定义(只需准备好看到整个列将由无聊的零组成)。
         A    C    D
  ZZ1  3.5  0.0  3.0
  ZZ2  0.0  2.3  5.9
  ZZ3  0.0  0.0  2.8