使用Scala从文件里读取文本行

代码呈现

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")

    }
  }


二、逐一解释

  1. val lines = Source.fromFile(args(0)).getLines().toList
    最后的toList必须加,因为getLines方法返回的是枚举器。一旦完成遍历,枚举器就失效了;而通过调用toList把它转换为List,我们把文件中的所有行都贮存在内存中,这时可以随时使用。lines变量因此就指向着包含了指定文件的文本字符串列表。
  2. def widthOfLength(s: String) = s.length.toString.length
    因为每行文本要计算两次,每次枚举各计数一次,所以把字符串的长度计算功能提炼成函数
  3. 计算字符串的最大长度
    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中包含的最常字符串
  4. 之后就可以把这行字符串传给widthOfLength计算最大宽度:
    for (line <- lines){
    val numSpaces = maxWidth widthOfLength(line)
    val padding = " " * numSpaces
    println(padding + line.length + " 1" +line)
    }

    for表达式再次枚举了全部文本行。对于每一行,首先计算行长度前所需的空格并把它赋值给numSpaces。然后用表达式 " " * numSpaces创建包含numSpaces个空格的字符串。最终打印出格式化的信息。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值