gpt4 book ai didi

scala - 压缩多个序列

转载 作者:行者123 更新时间:2023-12-03 08:30:10 24 4
gpt4 key购买 nike

我试图zip多个序列以形成一个长元组:

val ints = List(1,2,3)
val chars = List('a', 'b', 'c')
val strings = List("Alpha", "Beta", "Gamma")
val bools = List(true, false, false)

ints zip chars zip strings zip bools

我得到的是:
List[(((Int, Char), String), Boolean)] =
List((((1,a),Alpha),true), (((2,b),Beta),false), (((3,c),Gamma),false))

但是我想得到一个平面元组序列:
List[(Int, Char, String, Boolean)] = 
List((1,a,Alpha,true), (2,b,Beta,false), (3,c,Gamma,false))

我现在可以做:
List(ints, chars, strings, bools).transpose

但是它返回弱类型的 List[List[Any]]。我也可以做 (ints, chars, strings).zipped,但是 zipped仅适用于2元组和3元组。

有没有一种方法可以轻松压缩(任意)多个等长序列?

最佳答案

这是解决示例的一种方法,但这不适用于任意数量的序列。

val ints = List(1,2,3)
val chars = List('a', 'b', 'c')
val strings = List("Alpha", "Beta", "Gamma")
val bools = List(true, false, false)

val input = ints zip chars zip strings zip bools

// Flattens a tuple ((A,B),C) into (A,B,C)
def f2[A,B,C](t: ((A,B),C)) = (t._1._1, t._1._2, t._2)

// Flattens a tuple ((A,B),C,D) into (A,B,C,D)
def f3[A,B,C,D](t: ((A,B),C,D)) = (t._1._1, t._1._2, t._2, t._3)

input map f2 map f3

我认为不可能对任意长度的元组进行通用处理,至少不能使用这种解决方案。据我所知,元组是强类型的,并且类型系统不允许您指定数量可变的类型参数,这使得不可能制作一个通用版本的 f2f3并采用任意长度的元组 ((A,B),C,D,...)(将返回元组 (A,B,C,D,...))。

如果有一种方法可以指定数量可变的类型参数,则在Scala的标准库中我们不需要使用trait Tuple1Tuple2,... Tuple22

关于scala - 压缩多个序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9632094/

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