繁体   English   中英

如何获取scala中选项列表List的当前和下一个元素

[英]How to get the current and next element of List of list of options in 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,?) }

我的输出如果我在For-comprehension中打印我的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中相同索引的元素,并进行必要的计算?

请帮我实现我的结果输出

尝试玩这个:

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
  }

}

它打印出你想要的数字,但是其中两个是交换的。 不过,我相信你能搞清楚。

所以你的数据结构意味着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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM