如何在值之间有宽度?

How to have width between values?

我正在努力解决 Scala for the Impatient 中提到的问题

7. Print a table of all Java properties, like this:
     java.runtime.name             | Java(TM) SE Runtime Environment
     sun.boot.library.path         | /home/apps/jdk1.6.0_21/jre/lib/i386
     java.vm.version               | 17.0-b16
     java.vm.vendor                | Sun Microsystems Inc.
     java.vendor.url               | http://java.sun.com/
     path.separator                | :
     java.vm.name                  | Java HotSpot(TM) Server VM
     You need to find the length of the longest key before you can print the table

我的尝试看起来像

scala> import scala.collection.JavaConversions.propertiesAsScalaMap
import scala.collection.JavaConversions.propertiesAsScalaMap

scala> val props: scala.collection.Map[String, String] = System.getProperties()
props: scala.collection.Map[String,String] =
Map(env.emacs -> "", java.runtime.name -> Java(TM) SE Runtime Environment, sun.boot.library.path -> /Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib, java.vm.version -> 25.51-b03, gopherProxySet -> false, java.vm.vendor -> Oracle Corporation, java.vendor.url -> http://java.oracle.com/, path.separator -> :, java.vm.name -> Java HotSpot(TM) 64-Bit Server VM, file.encoding.pkg -> sun.io, user.country -> US, sun.java.launcher -> SUN_STANDARD, sun.os.patch.level -> unknown, java.vm.specification.name -> Java Virtual Machine Specification, user.dir -> /Users/harit, java.runtime.version -> 1.8.0_51-b16, java.awt.graphicsenv -> sun.awt.CGraphicsEnvironment, java.endorsed.dirs -> /Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk...

然后找出键中的最大长度

scala> props.keys.map(_.length).max
res24: Int = 29

然后我

scala> for ((k,v) <- props) yield printf("%s%29s\n", k, "|" + v.trim)

但我看到的不是我想要的

env.emacs                            |
java.runtime.name|Java(TM) SE Runtime Environment
sun.boot.library.path|/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib
java.vm.version                   |25.51-b03
gopherProxySet                       |false
java.vm.vendor          |Oracle Corporation
java.vendor.url     |http://java.oracle.com/
path.separator                           |:
java.vm.name|Java HotSpot(TM) 64-Bit Server VM
file.encoding.pkg                      |sun.io
user.country                          |US
sun.java.launcher                |SUN_STANDARD
sun.os.patch.level                     |unknown
java.vm.specification.name|Java Virtual Machine Specification
user.dir                |/Users/harit
java.runtime.version                |1.8.0_51-b16
java.awt.graphicsenv|sun.awt.CGraphicsEnvironment
java.endorsed.dirs|/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib/endorsed
os.arch                      |x86_64
java.io.tmpdir|/var/folders/39/rrqhhzfn42bf7qcwqg2kywtr0000gn/T/
line.separator                            |
java.vm.specification.vendor          |Oracle Corporation
os.name                    |Mac OS X
sun.jnu.encoding                       |UTF-8
java.library.path|/Users/harit/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.
java.specification.name|Java Platform API Specification
java.class.version                        |52.0
sun.management.compiler|HotSpot 64-Bit Tiered Compilers
os.version                     |10.10.4
http.nonProxyHosts|local|*.local|169.254/16|*.169.254/16
user.home                |/Users/harit
user.timezone         |America/Los_Angeles
scala.home|/usr/local/Cellar/scala/2.11.7/libexec
java.awt.printerjob|sun.lwawt.macosx.CPrinterJob
file.encoding                       |UTF-8
java.specification.version                         |1.8
scala.usejavacp                        |true
java.class.path                          |""
user.name                       |harit
java.vm.specification.version                         |1.8
sun.java.command|scala.tools.nsc.MainGenericRunner
java.home|/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre
sun.arch.data.model                          |64
user.language                          |en
java.specification.vendor          |Oracle Corporation
awt.toolkit |sun.lwawt.macosx.LWCToolkit
java.vm.info                  |mixed mode
java.version                    |1.8.0_51
java.ext.dirs|/Users/harit/Library/Java/Extensions:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib/ext:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java
sun.boot.class.path|/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib/sunrsasign.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/classes:/usr/local/Cellar/scala/2.11.7/libexec/lib/akka-actor_2.11-2.3.10.jar:/usr/local/Cellar/scala/2.11.7/libexec/lib/config-1.2.1.jar:/usr/local/Cellar/scala/2.11.7/libexec/lib/jline-2.12.1.jar:/usr/local/Cellar/scala/2.11.7/libexec/lib/scala-actors-2.11.0.jar:/usr/local/Cellar/scala/2.11.7/libexec/lib/scala-actors-migration_2.11-1.1.0.jar:/usr/local/Cellar/scala/2.11.7/libexec/lib/scala-compiler.jar:/usr/local/Cellar/scala/2.11.7/libexec/lib/scala-continuations-library_2.11-1.0.2.jar:/usr/local/Cellar/scala/2.11.7/libexec/lib/scala-continuations-plugin_2.11.7-1.0.2.jar:/usr/local/Cellar/scala/2.11.7/libexec/lib/scala-library.jar:/usr/local/Cellar/scala/2.11.7/libexec/lib/scala-parser-combinators_2.11-1.0.4.jar:/usr/local/Cellar/scala/2.11.7/libexec/lib/scala-reflect.jar:/usr/local/Cellar/scala/2.11.7/libexec/lib/scala-swing_2.11-1.0.2.jar:/usr/local/Cellar/scala/2.11.7/libexec/lib/scala-xml_2.11-1.0.4.jar:/usr/local/Cellar/scala/2.11.7/libexec/lib/scalap-2.11.7.jar
java.vendor          |Oracle Corporation
file.separator                           |/
java.vendor.url.bug|http://bugreport.sun.com/bugreport/
sun.io.unicode.encoding                  |UnicodeBig
sun.cpu.endian                      |little
socksNonProxyHosts|local|*.local|169.254/16|*.169.254/16
ftp.nonProxyHosts|local|*.local|169.254/16|*.169.254/16
sun.cpu.isalist                            |
res25: Iterable[Unit] = ArrayBuffer((), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), ())

怎么了?

更新

我也试过了

scala> for ((k,v) <- props) yield println(k.padTo(29-k.length, " ").mkString + "|" + v)

但运气不好

env.emacs           |
java.runtime.name|Java(TM) SE Runtime Environment
sun.boot.library.path|/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib
java.vm.version|25.51-b03
gopherProxySet |false
java.vm.vendor |Oracle Corporation
java.vendor.url|http://java.oracle.com/
path.separator |:
java.vm.name     |Java HotSpot(TM) 64-Bit Server VM
file.encoding.pkg|sun.io
user.country     |US
sun.java.launcher|SUN_STANDARD
sun.os.patch.level|unknown
java.vm.specification.name|Java Virtual Machine Specification
user.dir             |/Users/harit
java.runtime.version|1.8.0_51-b16
java.awt.graphicsenv|sun.awt.CGraphicsEnvironment
java.endorsed.dirs|/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib/endorsed
os.arch               |x86_64
java.io.tmpdir |/var/folders/39/rrqhhzfn42bf7qcwqg2kywtr0000gn/T/
line.separator |

java.vm.specification.vendor|Oracle Corporation
os.name               |Mac OS X
sun.jnu.encoding|UTF-8
java.library.path|/Users/harit/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.
java.specification.name|Java Platform API Specification
java.class.version|52.0
sun.management.compiler|HotSpot 64-Bit Tiered Compilers
os.version         |10.10.4
http.nonProxyHosts|local|*.local|169.254/16|*.169.254/16
user.home           |/Users/harit
user.timezone   |America/Los_Angeles
scala.home         |/usr/local/Cellar/scala/2.11.7/libexec
java.awt.printerjob|sun.lwawt.macosx.CPrinterJob
file.encoding   |UTF-8
java.specification.version|1.8
scala.usejavacp|true
java.class.path|""
user.name           |harit
java.vm.specification.version|1.8
sun.java.command|scala.tools.nsc.MainGenericRunner
java.home           |/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre
sun.arch.data.model|64
user.language   |en
java.specification.vendor|Oracle Corporation
awt.toolkit       |sun.lwawt.macosx.LWCToolkit
java.vm.info     |mixed mode
java.version     |1.8.0_51
java.ext.dirs   |/Users/harit/Library/Java/Extensions:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib/ext:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java
sun.boot.class.path|/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib/sunrsasign.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/classes:/usr/local/Cellar/scala/2.11.7/libexec/lib/akka-actor_2.11-2.3.10.jar:/usr/local/Cellar/scala/2.11.7/libexec/lib/config-1.2.1.jar:/usr/local/Cellar/scala/2.11.7/libexec/lib/jline-2.12.1.jar:/usr/local/Cellar/scala/2.11.7/libexec/lib/scala-actors-2.11.0.jar:/usr/local/Cellar/scala/2.11.7/libexec/lib/scala-actors-migration_2.11-1.1.0.jar:/usr/local/Cellar/scala/2.11.7/libexec/lib/scala-compiler.jar:/usr/local/Cellar/scala/2.11.7/libexec/lib/scala-continuations-library_2.11-1.0.2.jar:/usr/local/Cellar/scala/2.11.7/libexec/lib/scala-continuations-plugin_2.11.7-1.0.2.jar:/usr/local/Cellar/scala/2.11.7/libexec/lib/scala-library.jar:/usr/local/Cellar/scala/2.11.7/libexec/lib/scala-parser-combinators_2.11-1.0.4.jar:/usr/local/Cellar/scala/2.11.7/libexec/lib/scala-reflect.jar:/usr/local/Cellar/scala/2.11.7/libexec/lib/scala-swing_2.11-1.0.2.jar:/usr/local/Cellar/scala/2.11.7/libexec/lib/scala-xml_2.11-1.0.4.jar:/usr/local/Cellar/scala/2.11.7/libexec/lib/scalap-2.11.7.jar
java.vendor       |Oracle Corporation
file.separator |/
java.vendor.url.bug|http://bugreport.sun.com/bugreport/
sun.io.unicode.encoding|UnicodeBig
sun.cpu.endian |little
socksNonProxyHosts|local|*.local|169.254/16|*.169.254/16
ftp.nonProxyHosts|local|*.local|169.254/16|*.169.254/16
sun.cpu.isalist|
res41: Iterable[Unit] = ArrayBuffer((), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), ())

正如@ymonad 在评论中指出的那样,以下内容对我有用

scala> for ((k,v) <- props) yield println(k.padTo(29, " ").mkString + "|" + v)

我认为,填充 hard-coding 值不是一个好的解决方案。我是动态写的:

 val props: Properties = System.getProperties
  val propsScala: mutable.Map[String, String] = props.asScala
  val padding = " "
  var lenght = 0

  for ((k, v) <- propsScala) if (k.length > lenght) lenght = k.length else lenght
  for ((k, v) <- propsScala) println(k + padding * (lenght - k.length - 1) + "| " + v)