scala 将元组解压为 case class 参数和附加的 zip 两个序列
scala unpack tuple into case class arguments and additional zip two sequences
我想将 Seq[String, Seq[Char]]
转换为 Seq[UnpackedObject]
但不知道如何将两个字符 (A, B) 的元组解包以分隔大小写 class 参数。
我想从 s1 和 s2 中创建 s3,这样:
Seq(("aaa", "A", B"), ("bbb", "B", C"), ("ccc", "C", "D"), ("ddd", "D", "D"))
因此我尝试使用案例 class 但是:
- 问题 1:将元组解包为两个参数;
- 问题 2:最后一个元素带有“D”,“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
,你可以调用tupled
apply
case class:
的函数
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) }
我想将 Seq[String, Seq[Char]]
转换为 Seq[UnpackedObject]
但不知道如何将两个字符 (A, B) 的元组解包以分隔大小写 class 参数。
我想从 s1 和 s2 中创建 s3,这样:
Seq(("aaa", "A", B"), ("bbb", "B", C"), ("ccc", "C", "D"), ("ddd", "D", "D"))
因此我尝试使用案例 class 但是:
- 问题 1:将元组解包为两个参数;
- 问题 2:最后一个元素带有“D”,“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
,你可以调用tupled
apply
case class:
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) }