Scala Как не читать файл дважды - PullRequest
1 голос
/ 10 января 2011

Вот пример программы, над которой я работаю, чтобы прочитать файл со списком значений по одному в строке.Я должен добавить все эти значения, преобразовывающие в 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 для сортировки, и мне нужно снова прочитать файл.Также я не хочу хранить их во временном списке.Есть ли какой-нибудь элегантный способ сделать это функционально?

Ответы [ 2 ]

5 голосов
/ 10 января 2011

Преобразуйте его в List, чтобы вы могли использовать его снова:

val lines = Source.fromFile("c://exp.txt").getLines().toList
3 голосов
/ 10 января 2011

Согласно моему комментарию, преобразовать его в список и переписать следующим образом

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)

}

}

...