2017-04-03 151 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