2017-04-03 117 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],但我不知道該怎麼做。我對scala很新。我試着將它分配到stock_map到 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 

斯卡拉for解析並不工作方式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

非常感謝!你的解決方案工作!是的,這是我的第一個scala程序沒有透徹理解for循環的理解。 – Issaq

+0

另外一件事,我試圖將值追加到列表中,因爲它是不可變的,我不能那樣做。而且我根本不能使用「var」。所以我用「val」引用的ListBuffer,但我仍然有問題。任何幫助將不勝感激 ?? – Issaq