import scala.io.Source
object Test {def main(args: Array[String]):Unit={def widthOfLength(s:String)= s.length.toString.length
val filePath ="文件路径"if(filePath.length >0){val lines = Source.fromFile(filePath,"UTF-8").getLines().toList
val longestLine = lines.reduceLeft((a, b)=>if(a.length > b.length) a else b
)val maxWidth = widthOfLength(longestLine)for(line <- lines){val numSpaces = maxWidth - widthOfLength(line)val padding =" "* numSpaces
println(padding + line.length +" "+ line)}}else
Console.err.println("Please enter filename")}}
二、逐一解释
val lines = Source.fromFile(args(0)).getLines().toList 最后的toList必须加,因为getLines方法返回的是枚举器。一旦完成遍历,枚举器就失效了;而通过调用toList把它转换为List,我们把文件中的所有行都贮存在内存中,这时可以随时使用。lines变量因此就指向着包含了指定文件的文本字符串列表。
计算字符串的最大长度 val longestLine = lines.reduceLeft( (a , b) => if (a.length > b.length) a else b ) val maxWidth = widthOfLength(longestLine) 找到最长的一行,把其值赋给maxWidth。 其中reduceLeft的方法把传入的方法参数应用于lnes的第一、二个元素,产生结果,然后再应用于这个结果和lines接下去的一个元素,以此类推直至整个列表。每次应用产生的结果都是已经调用过的参数中最长的一行,因为传入的函数 (a , b) => if (a.length > b.length) a else b,返回两个传入字符串中长的那个。reduceLeft将返回最后一次应用的结果,也就是本例lines中包含的最常字符串
之后就可以把这行字符串传给widthOfLength计算最大宽度: for (line <- lines){ val numSpaces = maxWidth widthOfLength(line) val padding = " " * numSpaces println(padding + line.length + " 1" +line) } for表达式再次枚举了全部文本行。对于每一行,首先计算行长度前所需的空格并把它赋值给numSpaces。然后用表达式 " " * numSpaces创建包含numSpaces个空格的字符串。最终打印出格式化的信息。