scala - 如何使用@tailrec 连接 scala.collection.mutable.WrappedArray 中的字符串?
问题描述
我需要连接 Scala 中 WrappedArray 中存在的字符串。我能够在 的帮助下做到这一点,List
但这不是我必须做的。我想要一个专门为 WrappedArray 设计的解决方案,并且在连接时可以添加/删除元素。我必须将此函数用作 udf 来通过 Spark SQL 转换数据collect_list
。这就是我被迫使用 WrappedArray 的原因。
例如->
WrappedArray("I","love","coding")
Output : String = I : love : coding
这只是一个添加冒号的例子。在使用 Wrapped Array 的情况下,我在匹配时遇到了各种类型的问题。
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)
}
}
解决方案
您的问题的原因是使用WrappedArray
which has notunapply
方法。模式匹配使用方法工作,您可以在scala 文档unapply
中阅读更多相关信息。只需将 WrappedArray 替换为 Array 并匹配表达式即可:
@tailrec
def sumAccumulator(ints: Array[String], accum: String): String = {
ints match {
case Array() => accum
case _ => sumAccumulator(ints.tail, accum + ints.head)
}
}
List
有子类型::
和Nil
。它们是案例类,案例类具有unapply
编译器生成的方法。
简而言之,我尝试描述它是如何工作的:当编译器寻找提取(在模式匹配中)时,它会查看,发现它是and has方法::
的子类型,如果返回正确的结果,它会选择这个分支。对于.List
unapply
unapply
Nil
推荐阅读
- java - "status":400,"error":"Bad Request","message":"必需的日期参数 'end' 不存在"
- android - 如何将自己的图像插入 SQLite 表?
- javascript - Kotlin 使用 window.fetch API 获取二进制数据
- django - Django model.objects.all() 查询集不显示内容 - 如何修复?
- php - Telegram Bot 回调-查询未发送
- reactjs - React - 如何构建自定义钩子?
- php - Laravel Eloquent ManyToMany with Pivot,带有数据透视表中变量的辅助查询?
- python - 策略梯度:为什么洗牌数据会导致性能下降?
- c# - 从视图到控制器的 ajax 对象不包含数据
- cygwin - 安装过程中名为“setup.zst.sig”的文件是什么?