如何创建给定类型的列表列表,其中大小可能因输入而异?

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 代替返回类型为Unitforeach

例如:

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)))

【讨论】:

以上是关于如何创建给定类型的列表列表,其中大小可能因输入而异?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 VBA 中设置因月份而异的文件路径?

线性回归预测因输入类型而异

如何在没有交叉产品的情况下从 BigQuery 中的两列中取消嵌套两个列表,作为单独的行

将类型对列表的向量大小设置为类中用户给定的大小

如何在Flutter(2021)中创建过滤器搜索列表视图

从连接表列表中选择唯一的列名