2017-04-03 10 views
1
Scala Code:- 
import scala.io.Source 

object Stocks1 { 

    val filename = "stocks.csv" 

    def main(args: Array[String]): Unit = { 
    readStocks(filename) 
    } 

    def readStocks(fn: String): Map[String, Float] = { 
//def readStocks(fn: String): Unit = { 
    def percentChange(observed: Float, expected: Float): Float = { 
     if (observed == 0 && expected == 0) 
     0.0f 
     else 
     ((observed - expected) * 100)/expected 
    } 

    for (line <- Source.fromFile(fn).getLines()) { 
     val list1 = line.split(",").map(_.trim).toList 
     //Assigning Map to a val so in order to return Map(String,Float) 
     val stock_map=Map(list1(2)->percentChange(list1(5).toFloat,list1(6).toFloat)) 
     stock_map 
    } 
    } 

私はMap[String, Float]を返す必要がありますが、それを行う方法はわかりません。私はスカラーにとってかなり新しいです。 stockxmapに Map(list1(2)->percentChange(list1(5).toFloat,list1(6).toFloat))に割り当てようとしましたが、Type MIsmatch. Expected "Map[String, Float]" found "Unit"というエラーが表示されています。スカラ - スカラの関数からの戻りマップ

答えて

1

以下を試してください。

(for { 
    line <- io.Source.fromFile(fn).getLines() 
    list1 = line.split(",").map(_.trim).toList 
} yield list1(2)->percentChange(list1(5).toFloat,list1(6).toFloat) 
).toMap 

Scalaのfor内包表記はfor()ループが他の言語で行うように動作しません。初心者は、彼らがどのように働いているかを公正に理解するまでは避けておくのが有利かもしれません。

これを念頭に置いて、これは理解しているものであり、理解しやすいかもしれません。

io.Source.fromFile(fn).getLines().map{ line => 
    val list1 = line.split(",").map(_.trim).toList 
    list1(2) -> percentChange(list1(5).toFloat, list1(6).toFloat) 
}.toMap 
+0

ありがとうございます!あなたのソリューションはうまくいった!はい、私の最初のスカラプログラムはforループの理解を完全に理解していませんでした。 – Issaq

+0

私はリストに値を追加しようとしているもう1つのことは、変更できないので、それを行うことはできません。そして私は "var"を全く使うことはできません。だから私は "val"参照でListBufferを使用しているが、私はまだ問題がある。どんな援助も感謝されますか? – Issaq