2011-01-10 47 views
1

以下是我正在研究的示例程序,用於讀取每行包含一個值列表的文件。我必須將所有這些值轉換爲double,並且還需要對值進行排序。這是我到目前爲止,它工作正常。Scala如何避免兩次讀取文件

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進行排序,並且需要再次從文件讀取。我也不想將它們存儲到臨時列表中。有沒有以功能性的方式做到這一點的優雅方式?

+1

你已經創建了一個隱式列表,那麼爲什麼你不想使用它呢?另外,我可能會考慮在地圖上替換一次,然後在該列表上進行後續工作。否則,你也要做兩次replaceAll函數。 – Mikezx6r 2011-01-10 15:01:16

回答

5

將其轉換爲List,這樣你就可以重複使用它:

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

謝謝!我認爲`val lines = Source.fromFile(「c://exp.txt」).getLines()。toList map(_.replaceAll(「,」,「」).toDouble)` – 2011-01-10 15:58:52

+0

能否請你解釋一下如何做反向排序(我的意思是降序)? – 2011-01-10 16:36:23

3

按我的意見,將其轉換爲一個列表,並改寫如下

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) 

} 

}