如何创建给定类型的列表列表,其中大小可能因输入而异?
Posted
技术标签:
【中文标题】如何创建给定类型的列表列表,其中大小可能因输入而异?【英文标题】:How do I create a List of Lists of a given type where the size could vary based on inputs? 【发布时间】:2020-03-06 08:28:25 【问题描述】:我需要创建一个返回 List[List[Option[Double]]] 的函数,其中该函数采用股票市场符号的 List[String] 以及函数必须查看的年份范围,所以类似于 Range[2000, 2019, 1]。
该函数将调用另一个函数:
def price(symbol: String, year: Int) : Option[Double] = ...
这将返回一个 Option[Double] Some(double) 或 None。所以假设我要创建的函数需要 List("GOOG", "AAPL") 和 Range[2010, 2013, 1],结果应该类似于:
List(List(Option for Google 2010, Option for Apple 2010),
List(Option for Google 2011, Option for Apple 2011),
List(Option for Google 2012, Option for Apple 2012)).
我不允许在我的代码中使用“var”,只能使用“val”,当然这意味着一旦声明就不能修改。
所以我要问的是,当我不知道 List[String] 或 Range 中有多少值时,如何创建这个 List[List[Option[Double]]]。我假设不可能在 for 循环中添加它,并且它必须在列表声明期间发生。
到目前为止,我唯一能想到的就是按照以下方式做一些事情:
val returnList : List[List[Option[Double]]] = List(x => rangeIn.foreach(List(y => symbolsIn.foreach(price(y, x)))))
【问题讨论】:
【参考方案1】:您可以使用map
代替返回类型为Unit
的foreach
。
例如:
val returnList : List[List[Option[Double]]] =
rangeIn.map(r => symbolsIn.map(s => price(s, r)))
Scala demo
【讨论】:
此外,第二张地图可以是一个平面地图,可以一起摆脱 Option 并删除可能的 Nones。 @Saskia 感谢您的评论,这是正确的。然后代码看起来像val returnList : List[List[Double]] = rangeIn.map(r => symbolsIn.flatMap(s => price(s, r)))
【参考方案2】:
@the-fourth-bird 的答案是正确的方法。
但您问是否可以在 for 循环中使用。在 scala 中,您很少看到传统的 for 循环,通常使用 for-comprehension。它看起来不像其他答案那么好,但有可能。
它对几乎相同的代码脱糖,除了一些包装。
val prices = (for
s <- List(symbols)
r <- range
yield s.flatMap(price(_, r)))
【讨论】:
以上是关于如何创建给定类型的列表列表,其中大小可能因输入而异?的主要内容,如果未能解决你的问题,请参考以下文章