2011-01-10 16 views
1

ここでは、1行に1つずつ値リストを含むファイルを読み込むためのサンプルプログラムを示します。これらの値をすべて二重に変換して追加し、値をソートする必要があります。ここまで私がこれまでにやってきたことはうまくいきます。Scalaファイルを2回読むのを避ける方法

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) 

    } 

} 

ここでの質問は、私がファイルを2回読んでいるので、それを避けたいと思っています。 Source.fromFile("c://exp.txt").getLines()はイテレータを提供するので、ループを1回だけ実行し、次の操作はnullになるため、再度ソートするためにlinesを再利用することはできず、再度ファイルから読み込む必要があります。また、私はそれらを一時的なリストに保存したくありません。機能的な方法でこれを行うエレガントな方法はありますか?

+1

を次のように書き換えます既に暗黙のリストを作成しているので、あなたはそれを使いたいのですが?また、一度置き換えたマップを実行してから、そのリストの後続作業を行うことも考えられます。それ以外の場合は、replaceAll関数もすべて2回実行しています。 – Mikezx6r

答えて

5

あなたはそれを再利用することができますので、Listに変換します、私のコメントを1として

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

ありがとう!私は 'val line = Source.fromFile(" c://exp.txt ").getLines()。toList map(_.replaceAll("、 "、" ").toDouble)に因数分解しました。 –

+0

あなたは説明してください逆の並べ替え(私は降順を意味する)を行う方法? –

+1

これは片道です:List(5.2、2.1、3.0、1.3).sorted(Ordering.Double.reverse) – thoredge

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) 

} 

}

+0

はい、実際にはちょっと修正してしまいましたが、 'val lines = Source.fromFile(" ( "、"、 "").toDouble) ' –

+0

BTW、ヘルプとヒントありがとうございました。 –