我有一些集合,比如长度未知的List或Array of Int,每个集合都是一位或两位数,并希望以4的宽度打印,例如:
a b c
11 9 12
7 12 1我希望有这样的东西:
List("a", "b", "c").mkString(s"%3s ")
val li = List(11, 9, 12)
li.mkString(s"%3d ")但是没有,至少在我找的地方没有。
有一个优雅的解决方案吗?我可以使用foldLeft吗?不知何故,我不明白:
(0 to 2).foldLeft("")((sofar, idx) => sofar + s"%3d${li(idx)} ")导致无法打印的"%3d11 %3d9 %3d12 "
对于3个元素,文字格式设置很容易
printf (s"%3d %3d %3d", li(0), li(1), li(2))
11 9 12但是对于更多的元素,特别是对于未知数量的元素,我该如何优雅地解决这个问题呢?
发布于 2021-01-01 14:33:23
在mkString之前将每个元素转换为所需格式的String。
Seq(23,5,111,7).map(n => f"$n%4d").mkString
//res0: String = " 23 5 111 7"或者,您可以构造一个单一格式的String,然后对集合执行format()操作。
val nums = Array(1, 22, 3, 444)
("%4d" * nums.length).format(nums:_*)
//res1: String = " 1 22 3 444"发布于 2021-01-04 20:25:23
你有更多的选择,基于伟大的How to convert an Int to a String of a given length with leading zeros to align?
Seq(11, 9, 12).map(n => "%4d".format(n)).mkString或者:
Seq(11, 9, 12).map(_.toString.reverse.padTo(4, ' ').reverse).mkString或者使用foldLeft
Seq(11, 9, 12).foldLeft("")((soFar, i) => soFar + "%4d".format(i))在Scastie上运行的代码。
https://stackoverflow.com/questions/65527668
复制相似问题