加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 压缩多个序列

发布时间:2020-12-16 09:46:51 所属栏目:安全 来源:网络整理
导读:我试图压缩多个序列形成一个长元组: 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),B
我试图压缩多个序列形成一个长元组:

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,(2,b,Beta,(3,c,Gamma,false))

我现在可以做:

List(ints,chars,strings,bools).transpose

但它返回弱类型List [List [Any]]。也可以做(ints,chars,字符串).zipped,但压缩只适用于2元组和3元组。

有没有办法拉链(任意)数的等长序列很容易?

解决方法

这里有一种方法来解决你的例子,但这不是一个任意数量的序列。

val ints = List(1,false)

val input = ints zip chars zip strings zip bools

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

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

input map f2 map f3

我不认为这是可能做到一般的任意长度的元组,至少不是这种解决方案。元组是强类型的,并且类型系统不允许你指定可变数目的类型参数,就我所知,这使得不可能使f2和f3的广义版本采用任意长度的元组((A,B),C,D,…)(将返回元组(A,B,C,D,…))。

如果有一种方法来指定可变数量的类型参数,我们不需要在Scala的标准库中的traits Tuple1,Tuple2,… Tuple22。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读