【问题标题】:How to get the current and next element of List of list of options in scala如何在scala中获取选项列表列表的当前和下一个元素
【发布时间】:2016-11-16 17:11:28
【问题描述】:

这个问题可能是重复的,但是,我没有遇到任何可以回答我的问题的问题。

所以我有一个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 中相同索引的元素并进行必要的计算?

请帮我实现我的结果输出

【问题讨论】:

  • 当您在 findDifference 方法中使用 .get 解开每个可能的值时,用 Some 包装您的值有什么意义?
  • 1 - 如果元素的索引很重要,则不能以这种方式使用 for 理解。 2 - 如果这些选项中的任何一个是None,您的代码将引发运行时异常。 (这就是 Options 的用途。) 3 - 我认为您的数据表示太复杂了。
  • 我添加了一些来解释我的问题。它不需要在里面。我只是不知道如何进行计算。有没有办法做到这一点? @jwvh
  • @PawełJurczenko 没有意义。我只是添加它来解释我的问题。
  • 你离得很近。查看您拥有( findDifference(i,?) } 的位置,它应该是( findDifference(i(0),i(1)) }。我在下面的回答几乎说了同样的话

标签: scala list nested-lists for-comprehension scala-option


【解决方案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
  }

}

它会打印您想要的数字,但其中两个被交换了。不过,我相信你可以弄清楚。

【讨论】:

  • 我喜欢你实现这个的方式,它就像一个魅力。但我试图仔细研究它为什么被交换。不知道。有什么线索吗?
  • @NaseebullahSafi:玩转指数和价值。使用您可以手动验证的数字。也许你需要交换外循环和内循环等
  • 你应该得到这个问题兄弟
【解决方案2】:

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

在这里你可以看到我调用时 i 的值:

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)

【讨论】:

  • 有更好的方法来构建您的数据。首先,您可以创建一个案例类Prices(oldPrice: Option[Double], newPrice: Option[Double]),这应该使您的代码更易于遵循,因为您可以按名称调用参数等。如果您确定总是得到一个价格,那么您可能根本不需要使用选项跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 2011-01-09
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多