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