2016-11-16 59 views
1

这个问题可能会被重复,但是,我还没有遇到任何问题可以解决我的问题。如何获得scala中选项列表的当前和下一个元素

所以我有一个List[ List[ Option[ Double ] ] ]

数据如下:

var tests = List(
    List(Some(313.062468), Some(27.847252)), 
    List(Some(301.873641), Some(42.884065)), 
    List(Some(332.373186), Some(53.509768)) 
) 

我想计算这个公式:以下

def findDifference(oldPrice: Option[Double], newPrice: Option[Double]): Option[Double] = { 
    return Some((newPrice.get - oldPrice.get)/oldPrice.get) 
} 

这是对两个列表的元素进行计算:

(Some(301.062468) - Some(313.062468))/Some(313.062468)

(Some(332.373186) - Some(301.873641))/Some(301.873641)

(Some(42.884065) - Some(27.847252))/Some(27.847252)

(Some(53.509768) - Some(42.884065))/Some(42.884065)

结果应该返回: #

List(
    List(Some(-0.03573991820699504), Some(0.5399747522663995)) 
    List(Some(0.10103414428290529), Some(0.24777742035415723)) 
) 

到目前为止我的代码

def findDifference(oldPrice: Option[Double], newPrice: Option[Double]): Option[Double] = { 
    return Some((newPrice.get - oldPrice.get)/oldPrice.get) 
} 

def get_deltas(data: List[List[Option[Double]]]): List[List[Option[Double]]] = { 
    for { 
    i <- data 
    // So this is where I am stuck. I have the current element i, but I need the same index element in the next list 
    } (findDifference(i,?) } 

我如果输出打印我的我在-理解

List(Some(313.062468), Some(27.847252)) 
 
List(Some(301.873641), Some(42.884065)) 
 
List(Some(332.373186), Some(53.509768))

我在哪里停留?

我被困在事实上,我不知道如何从列表2和列表3中获得列表1中的相同索引的元素,并进行必要的计算?

请帮我实现我的结果输出

+0

当您在'findDifference'方法中使用'.get'打开每个可能的值时,用'Some'包装你的值有什么意义? –

+0

1 - 如果元素的索引很重要,则不能以这种方式使用'for'理解。 2 - 如果其中任何选项为“无”,您的代码将抛出运行时异常。 (这是选项的用途。)3 - 我认为你的数据表示太复杂了。 – jwvh

+0

我添加了一些解释我的问题。它不需要在里面。我只是不知道该怎么做计算。有没有办法呢? @jwvh –

回答

0

尝试玩这个:

object OptIdx { 

    def main(args: Array[String]) { 
    println(get_deltas(tests)) 
    } 

    var tests = List(
    List(Some(313.062468), Some(27.847252)), 
    List(Some(301.873641), Some(42.884065)), 
    List(Some(332.373186), Some(53.509768))) 

    def findDifference(oldPrice: Option[Double], newPrice: Option[Double]): Option[Double] = { 
    Some((newPrice.get - oldPrice.get)/oldPrice.get) 
    } 

    def get_deltas(data: List[List[Option[Double]]]): List[List[Option[Double]]] = { 
    (for { 
     index <- 0 to 1 
    } yield { 
     (for { 
     i <- 0 to data.length - 2 
     } yield { 
     findDifference(data(i)(index), data(i + 1)(index)) 
     }).toList 
    }).toList 
    } 

} 

它打印出你想要的数字,但它们中的两个交换。不过,我相信你可以弄明白。

+0

我喜欢你如何实现这一点,它作品像一个魅力,但我试图仔细研究为什么它被交换,没有想法,任何线索? –

+0

@NaseebullahSafi:玩指数和价值观,使用数字,你可以用手来验证,也许你需要交换外部循环和内部等 – radumanolescu

+0

是的欢呼的人修正了它 –

0

所以你的数据结构意味着i是两个选项的列表。你需要的值已经存在,所以你可以调用i(0)i(1)

我做了一个快速和肮脏的人在REPL:

scala> val tests = List(
    | List(Some(313.062468), Some(27.847252)), 
    | List(Some(301.873641), Some(42.884065)), 
    | List(Some(332.373186), Some(53.509768)) 
    |) 
tests: List[List[Some[Double]]] = List(List(Some(313.062468), Some(27.847252)), List(Some(301.873641), Some(42.884065)), List(Some(332.373186), Some(53.509768))) 

在这里,你可以看到我的价值,当我打电话:

scala> for { i <- tests } println(i) 
List(Some(313.062468), Some(27.847252)) 
List(Some(301.873641), Some(42.884065)) 
List(Some(332.373186), Some(53.509768)) 

所以,你可以这样调用findDifference

scala> def findDifference(oldPrice: Option[Double], newPrice: Option[Double]): Option[Double] = { 
    | Option((oldPrice.get - newPrice.get) /oldPrice.get) 
    | } 
findDifference: (oldPrice: Option[Double], newPrice: Option[Double])Option[Double] 

scala> for { i <- tests } println(findDifference(i(0), i(1))) 
Some(0.911048896477747) 
Some(0.8579403459740957) 
Some(0.8390069648999904) 
+0

有更好的方法来构造你的数据首先你可以创建一个case类的价格(oldPrice:Option [Double], newPrice:Option [Double])'这应该使你的代码更容易遵循,因为你可以通过名字等来调用params。如果你确定总是得到一个价格,那么你可能根本不需要使用选项 –

相关问题