我正在努力解决关于Scala的基本问题。
我在Scala中创建了一个case类。此案例类正在使用下面的地图填充文件。它正在发挥作用。
但是当我试图从收益中获得单个元素时,我不知道如何提取它。
case class PBDivi(
val country : String,
val PB : Double,
val Diviyield : Double)
val PB = io.Source.fromFile(PBConfFile,"UTF-8").getLines.map(_.split(",")).map {p =>
val country = p(0)
val PB = p(1).toDouble
val Diviyield = p(2).toDouble
PBDivi(country,PB,Diviyield)
}
val country = "UK" //> country : String = UK
val a = for (i <- PB; if i.country == country ) yield (i.PB,i.Diviyield)
//> a : Iterator[(Double, Double)] = non-empty iterator
val b = a.toList.head //> b : (Double, Double) = (2.5,0.025)
你可以看到b是(Double:Double)。我怎样才能分别获得2.5和0.025。
请帮帮我。
答案 0 :(得分:4)
你可以从像这样的元组绑定val
:
val (pb, diviyield) = a.toList.head
或者您可以使用unzip
获得两个列表:
val (pbs, diviyields) = a.toList.unzip
然后,您可以追加或交错列表,或者您需要做的任何事情。
答案 1 :(得分:1)
如@MattPutnam回答中已经提到的模式匹配和解压缩的附注,为了获得在集合中保存谓词的头(或第一)项,请考虑
val a = PB.collectFirst { case v if v.country == "UK" => (v.PB,v.Diviyield) }
提供Option[(Double,Double)]
。然后
val (pb, div) = a.getOrElse( (0,0) )
其中zero是案例PB
的默认值,不包括满足条件的任何条目。
在这种方法中,一旦达到第一次击中,我们就停止迭代;如果没有找到解决方案,我们会提供默认值(明确定义)。
答案 2 :(得分:1)
有很多选择。以下是一些:
val b = a.toList.head
val (x, y) = b
val z = b._1; val w = b._2
for ((k, l) <- a) println(s"$k: $l")