2016-11-03 8 views
1

私はファイルを読み込み、各ファイルに行番号を追加しています。以下は、この例を容易にするためのリストである:スカラクラスとケースクラス

val testList: List[String] = List("Dont", "Do", "It"

val output: List[(String, Int)] = (testList.zipWithIndex) 

私のプログラムは._1 & ._2アクセサを使用して、コードのにおいのビットを得ています。私が作成した:

case class File(line: String, lineNum: Int) 

しかし、私はこのケースクラスを最大限に活用する方法を知っている唯一の方法は、以下を使用することです:

val fileOutput: List[File] = for{(line, lineNum) <- output} yield{File(line, lineNum)} 

私の質問:なぜ私はこれを行うことはできませんが?

val output: List[File] = (testList.zipWithIndex) 

私は、ケースクラスを使用するためにファイルに2回のパスを実行するのに少し疲れています。事前に

おかげ

答えて

2

、例えば:あなたはどのFileのリストに、ライン/インデックスタプルのリストをマッピングされ、ここで一歩を逃しています

for ((line, lineNum) <- testList.iterator.zipWithIndex) yield File(line, lineNum) 
+0

が働いていましたが、最後に.toListを追加しなければならなかったので、型の不一致について不平を言っていました。ありがとう! –

3

あなたはそれが動作しない理由をScalaのREPLの最後の行は、あなたが表示されますことをしようとした場合:このエラーの意味は何

scala> val output: List[File] = testList.zipWithIndex 
<console>:13: error: type mismatch; 
found : List[(String, Int)] 
required: List[File] 
     val output: List[File] = testList.zipWithIndex 

testList.zipWithIndex(String, Int)型を持つということです、Fileと入力するのではなく、 (彼らは怠け者であるため)あなたが複数のパスを避けることができるIterators使用する場合

scala> testList.zipWithIndex.map { case (line, index) => File(line, index) } 
res0: List[File] = List(File(Dont,0), File(Do,1), File(It,2)) 
1

私はあなたのケースクラスのインスタンスにタプルをマップすることが必要だと思います。

case class FileLine(line: String, lineNum: Int) 

val testList: List[String] = List("Dont", "Do", "It") 
val contents = testList.zipWithIndex.map{case (t,n) => FileLine(t,n)} 
// contents: List[FileLine] = List(FileLine(Dont,0), FileLine(Do,1), FileLine(It,2)) 
+2

'testList.zipWithIndex.map(FileLine.tupled)'が短い –

0

またtestList.zipWithIndex.map((File(_, _)).tupled)に他の回答で無名関数{ case (line, index) => File(line, index) }を簡素化することができます。

関連する問題