scala将元组解包为case类参数并附加压缩两个序列



我想将Seq[String, Seq[Char]]转换为Seq[UnpackedObject],但不知道如何解包两个char (A, B)的元组以分离case类参数。

我想从s1和s2中创建s3,这样:

Seq(("aaa", "A", B"), ("bbb", "B", C"), ("ccc", "C", "D"), ("ddd", "D", "D"))

因此我尝试使用case类但是:

  • 问题1:将元组解包为两个参数;
  • 问题2:最后一个元素带有"D", "<——我不知道怎么解决。
val s1 = Seq("aaa", "bbb", "ccc", "ddd")
val s2 = ('A' to 'D').sliding(2).toSeq
val pairs = (s1, s2).zipped.map { case (a, b) => UnpackedObject(a, b) }

case class UnpackedObject(a: String, b: Char, c: Char)

以上是我目前为止的代码。

zipped函数期望Seq具有相同的长度,但您传递的s2长度为3,s1长度为4。您需要在s2中添加一个元素来获得s3:

val s1 = Seq("aaa", "bbb", "ccc", "ddd") 
val s2 = ('A' to 'D').sliding(2).toSeq :+ Seq('D', 'D')
// ('A' to 'D').sliding(2) will return just 
// Seq(Seq('A', 'B'), Seq('B', 'C'), Seq('C', 'D'))
val pairs = (s1, s2).zipped.map { case (a, b) => (a, b.head, b.last) }
// will return Seq((aaa,A,B), (bbb,B,C), (ccc,C,D), (ddd,D,D))

如果需要创建UnpackedObject,只需调用case类的tupledapply函数即可:

val objects = (s1, s2).zipped.map { case (a, b) => (a, b.head, b.last) }
.map((UnpackedObject.apply _).tupled)
// will return 
// Seq(
//   UnpackedObject(aaa,A,B), UnpackedObject(bbb,B,C), 
//   UnpackedObject(ccc,C,D), UnpackedObject(ddd,D,D))

b不是元组,而是一个索引序列,所以:

val pairs = (s1, s2).zipped.map { case (a, b) => UnpackedObject(a, b(0), b(1)) }

val pairs = (s1, s2).zipped.map { case (a, b) => UnpackedObject(a, b.head, b.last) }

对于第二点和使用元组,你可以这样做:

val s1 = Seq("aaa", "bbb", "ccc", "ddd")
val s2 = ('A' to 'D').zip(('B' to 'D')) :+ ('D', 'D')
val pairs = (s1, s2).zipped.map { case (a, b) => UnpackedObject(a, b._1, b._2) }

最新更新