如何使用@tailrec连接scala.collection.mutable.wrappedarray中的字符串?

j13ufse2  于 2021-05-29  发布在  Spark
关注(0)|答案(3)|浏览(476)

我需要在scala中连接wrappedarray中的字符串。我能在老师的帮助下做这件事 List 但这不是我要做的。我想要一个专门为wrappedarray设计的解决方案,可以在连接时添加/删除元素。我必须使用这个函数作为通过sparksql转换数据的自定义项 collect_list . 这就是我被迫使用wrappedarray的原因。
例如->

WrappedArray("I","love","coding")
Output : String = I : love : coding

这只是一个添加冒号的示例。我面临着各种类型的问题,而匹配的情况下 Package 数组。

import scala.annotation.tailrec

object tailRecursionString {

  def getString(ints :scala.collection.mutable.WrappedArray[String]): String = {
    @tailrec
    def sumAccumulator(ints: scala.collection.mutable.WrappedArray[String], accum: String): String = {
      ints match {
        case Nil :  => accum
        case x :: tail => sumAccumulator(tail, accum + x)
      }
    }
    sumAccumulator(ints, "[") + "]"
  }

  def main(args: Array[String]): Unit = {
    val list : scala.collection.mutable.WrappedArray[String] = Array("kumar","sambhav","is","a","good","boy")
    val sum = getString(list)
    println(sum)
  }

}
icnyk63a

icnyk63a1#

你可以为我写 Seq 一般来说:

import scala.annotation.tailrec

def getString(ints :Seq[String]): String = {
  @tailrec
  def sumAccumulator(ints: Seq[String], accum: String): String = {
   ints match {
     case Seq(x)  => accum
     case  Seq(x, xs@_*) => sumAccumulator(xs, accum + x)
   }
 }
 sumAccumulator(ints, "[") + "]"

}
作为 WrappedArray 也是一个 Seq ,这样就行了

pbwdgjma

pbwdgjma2#

val seperator = " "
s"[${scala.collection.mutable.WrappedArray("I", "love", "coding").mkString(seperator)}]"

如果您想应用一个过滤器,您仍然可以使用过滤器,并实现相同的效果。

<script src="https://scastie.scala-lang.org/lttp77S4Sout7VWkOXTEhQ.js"></script>
5anewei6

5anewei63#

你问题的原因是使用 WrappedArray 哪个还没有 unapply 方法。模式匹配使用 unapply 方法,您可以在scala文档中阅读更多关于此方法的信息。只需将wrappedarray替换为数组和匹配的表达式,它就可以工作了:

@tailrec
def sumAccumulator(ints: Array[String], accum: String): String = {
  ints match {
    case Array()  => accum
    case _ => sumAccumulator(ints.tail, accum + ints.head)
  }
}
``` `List` 具有子类型 `::` 以及 `Nil` . 它们是case类,case类具有 `unapply` 编译器生成的方法。
简而言之,我试着描述它是如何工作的:编译器在寻找抽取(在模式匹配中)时 `::` ,看到它是 `List` 而且已经 `unapply` 方法,如果 `unapply` 如果选择此分支,则返回正确的结果。同样的方法 `Nil` .

相关问题