如何从scala Iterator获取每个double元素[(Double,Double)]

时间:2015-02-22 23:29:21

标签: scala

我正在努力解决关于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。

请帮帮我。

3 个答案:

答案 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")