gpt4 book ai didi

Scala - 在保持相同类型的同时扩展各种类型的列表

转载 作者:行者123 更新时间:2023-12-01 10:17:17 26 4
gpt4 key购买 nike

我有一个像这样的各种类型的列表:

验证数据:List[(String, Int, List[String])] = List(("foo", 1, List("a", "b")), ("bar", 2 , 列表("c", "d")), ("baz", 1, 列表("e", "f")))

当 Int 值大于 1 时,我尝试为该范围(从 1 到 Int)中的每个 Int 复制这些项目 - 所以理想情况下它看起来像(强调 Int 需要每次迭代从 1 递增到 Int):

val dataExpanded: List[(String, Int, List[String])] = List(("foo", 1, List("a", "b")), ("bar", 1 , 列表("c", "d")), ("栏", 2, 列表("c", "d")), ("baz", 1, 列表("e", "f")) )

在 Scala 中处理类型经常让我头疼,尤其是嵌套结构,因为每个操作似乎都会引入越来越多的类型陷阱。

所以在我尝试的时候:

val dataExpanded = data.map{ case (s, i, l) =>

if (i > 1) {

List.range(1, i+1).map { n =>
(s, n, l)
}

} else {
(s, i, l)
}
}

我得到结果:

> dataExpanded: List[Product with java.io.Serializable] = List((foo,1,List(a, b)), List((bar,1,List(c, d)), (bar,2,List(c, d))), (baz,1,List(e, f)))

结果看起来是在正确的路径上,但是展开的元素嵌套在它们自己的列表中,因此我认为 Type 是错误的。没有多少 flatMapping 或扁平化或映射 for 循环的输出让我摆脱困境。

这可能也与我的案例陈述有关,而不是处理 None 案例,但我不确定如何处理其他案例(我知道这样说是不对的,但我不会真的有任何其他案例在我的数据中——尽管那是动态类型语言的醉人之处)

有没有办法在从 datadataExpanded 时保持预期的类型,同时避免不必要的循环?

最佳答案

考虑元组的案例类,像这样

case class Datum(s: String, n: Int, xs: List[String])

因此给予

val data: List[Datum] = List(Datum("foo", 1, List("a", "b")), 
Datum("bar", 2, List("c", "d")),
Datum("baz", 1, List("e", "f")))

我们可以在 case 类中使用 copy 方法,如下所示,

def expand(d: Datum) = (1 to d.n).map (i => d.copy(n=i))

复制字段内容并修改指定字段,在本例中为n。因此对于data

data.flatMap(expand(_))

提供所需的输出。

关于Scala - 在保持相同类型的同时扩展各种类型的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27929422/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com