【问题标题】:Scala How to avoid reading the file twiceScala如何避免两次读取文件
【发布时间】:2011-06-06 14:06:43
【问题描述】:

这是我正在编写的示例程序,用于读取每行一个值列表的文件。我必须添加所有这些转换为 double 的值,并且还需要对值进行排序。这是我到目前为止提出的,它工作正常。

import scala.io.Source

object Expense{

  def main(args: Array[String]): Unit = {

    val lines = Source.fromFile("c://exp.txt").getLines()

    val sum: Double = lines.foldLeft(0.0)((i, s) => i + s.replaceAll(",","").toDouble)
    println("Total => " + sum)


    println((Source.fromFile("c://exp.txt").getLines() map (_.replaceAll(",", "").toDouble)).toList.sorted)

  }

}

这里的问题是,如您所见,我正在读取文件两次,我想避免它。由于Source.fromFile("c://exp.txt").getLines() 为您提供了一个迭代器,因此我只能循环遍历它一次,下一次操作将为空,因此我不能再次重用lines 进行排序,我需要再次从文件中读取。另外我不想将它们存储到临时列表中。有什么优雅的方法可以以实用的方式做到这一点吗?

【问题讨论】:

  • 您已经在创建一个隐式列表,为什么不想使用一个呢?另外,我可能会考虑做一次你 replaceAll 的地图,然后在该列表上进行后续工作。否则,您也将执行所有 replaceAll 函数两次。

标签: scala functional-programming scala-2.8


【解决方案1】:

按照我的评论,转换成列表,改写如下

import scala.io.Source

object Expense{

  def main(args: Array[String]): Unit = {

    val lines = Source.fromFile("c://exp.txt").getLines() map (_.replaceAll(",","").toDouble)

    val sum: Double = lines.foldLeft(0.0)((i, s) => i + s)
    println("Total => " + sum)
    println(lines.toList.sorted)

}

}

【讨论】:

  • 是的,实际上这就是我最终的结果,稍作修改,val lines = Source.fromFile("c://exp.txt").getLines().toList map (_.replaceAll(",", "").toDouble)
【解决方案2】:

将其转换为List,以便您可以重复使用它:

val lines = Source.fromFile("c://exp.txt").getLines().toList

【讨论】:

  • 谢谢!我重新考虑到val lines = Source.fromFile("c://exp.txt").getLines().toList map (_.replaceAll(",", "").toDouble)
  • 能否请您解释一下如何进行反向排序(我的意思是降序)?
  • 这是一种方式:List(5.2, 2.1, 3.0, 1.3).sorted(Ordering.Double.reverse)
猜你喜欢
  • 2014-08-22
  • 1970-01-01
  • 2019-10-06
  • 2023-03-08
  • 1970-01-01
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
  • 2020-11-12
相关资源
最近更新 更多