【问题标题】:scala unpack tuple into case class arguments and additional zip two sequencesscala 将元组解包到案例类参数和附加的 zip 两个序列中
【发布时间】:2021-08-11 14:25:48
【问题描述】:

我想将Seq[String, Seq[Char]] 转换为Seq[UnpackedObject],但不知道如何解压缩两个字符(A,B)的元组以分隔案例类参数。

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

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

因此我尝试使用案例类但是:

  • 问题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)

到目前为止,这是我的代码。

【问题讨论】:

    标签: scala zip unpack


    【解决方案1】:

    zipped 函数期望 Seq 具有相同的长度,但您传递了长度为 3 的 s2s1 长度为 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))
    

    【讨论】:

    • 我认为最终的map 函数可能只是UnpackedObject.tupled
    【解决方案2】:

    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) }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-10
      • 2012-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多