2011-07-02 8 views
0

私は自由な時間にScalaを学び、より機能的な方法でコードを書くことを試みました。とにかく書いてみると問題が発生しました(私が思うもの)は、フォーマットされた名前データをファイルから読み込み、ケースクラスを含むそのデータのリストを作成するためのシンプルなツールになります:これはうまくいかない:Scala:IOからファイルを読み込み、行ごとにcaseクラスを作成し、ケースクラスをリストに追加します

object NameDataUtil { 

    /** 
    * reads a data file containing formatted name data into a list containing case classes. 
    * 
    * @param fileName name of the file (with extension) to read the data from. 
    * @return a list of case classes containing the data from the specified file. 
    */ 
    def readInFile(fileName: String): List[NameDatum] = { 

    val names: List[NameDatum] = Source.fromURL(getClass.getResource("/"+fileName)).getLines() foreach { line => 
    line.trim.split("\\s+") 
    match { 
     case Array(name,freq,cumFreq,rank) => NameDatum(name, freq.toDouble, cumFreq.toDouble, rank.toInt) 
    } 
    } 

    names 
    } 
} 

ご協力いただきまして誠にありがとうございます。ありがとう!

+0

してくださいに技術をチェックアウトし、常に追加することになります...試合で正規表現を使用することができるということです質問への完全なエラーメッセージ(または部分的なスタックトレース)。 –

答えて

2

foreachmapと交換すると、Iterator[NameDatum]が返されます。 getLines()の後にtoListを追加してList[NameDatum]を取得してください。toStreamを使用し、ファイルが大きすぎてメモリに収まらない場合は、代わりにStream[NameDatum]を使用してください。

+0

ダニエルは完璧に働いてくれてありがとう。元の投稿にエラーメッセージを表示しないことについて申し訳ありません。また、ほんの数分後に同様の答えを提供するEricにも、マッチのために正規表現を使うことを提案してくれてありがとう。 –

1

私は、あなたがユニットの戻り値の型を持つforeachを使用していることが問題だと思います。次からのforeachの署名を参照してください。 http://www.scala-lang.org/api/current/index.html#scala.collection.Iterator

def foreach (f: (A) ⇒ Unit): Unit 

トリックを行うだろうかするマップである、あなたは(上記のリンクのように)メソッドのシグネチャを見ることができるときにそう

def map [B] (f: (A) ⇒ B): Iterator[B] 

です各行でマッチを実行すると、あなたのNameDatumであるタイプBにラインのタイプ(すなわちString)であるタイプAをマップします。

また、あなたは面白いかもしれない何かが、あなたが、これは、スプリットを使用する代わりになり、次の http://ikaisays.com/2009/04/04/using-pattern-matching-with-regular-expressions-in-scala/

+0

ありがとう!私はダニエルの答えを受け入れました。なぜなら、それは同じ答えでしたが、彼は最初でした。しかし、あなたの正規表現のリンクは面白く、私はそれを調べています。 –

関連する問題