2016-11-16 133 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。如果你確定總是得到一個價格,那麼你可能根本不需要使用選項 –

相關問題