【问题标题】:scala - a better way to parse an array of strings into a single stringscala - 将字符串数组解析为单个字符串的更好方法
【发布时间】:2018-08-03 15:31:35
【问题描述】:

我已经实现了一种方法,该方法应该将字符串数组转换为单个字符串。但是在将它与 UDF 一起使用并将 UDF 应用于列时出现异常: val concatUdf = udf(convertArray)

java.lang.ClassCastException: scala.collection.mutable.WrappedArray$ofRef cannot be cast to [Ljava.lang.String;

为了返回有效的字符串,在我当前的实现中应该改进什么?我是 Scala 新手,可能这不是最优雅的解决方案。

def convertArray: Array[String] => String =
      (strings: Array[String]) => {
        Option(strings) match {
          case Some(arr) => strings.mkString(", ")
          case Some(Array()) => ""
          case None => ""
        }
      }

【问题讨论】:

    标签: scala function


    【解决方案1】:

    我相信你可以做到

    def convertArray(strings: Array[String]): String =
      if (strings.nonEmpty)
        strings.mkString(", ")
      else
        ""
    

    在您的代码中,第二个 case 无法访问,因为您的第一个案例将始终匹配,包括空数组。也就是说,您的代码在 Scala 2.12.6 上对我来说似乎运行良好(除了关于无法访问代码的警告):

    scala> def convertArray: Array[String] => String =
         |       (strings: Array[String]) => {
         |         Option(strings) match {
         |               case Some(arr) => strings.mkString(", ")
         |           case Some(Array()) => ""
         |           case None => ""
         |         }
         |       }
    <console>:15: warning: unreachable code
                     case Some(Array()) => ""
                                           ^
    convertArray: Array[String] => String
    
    scala> convertArray(Array())
    res1: String = ""
    
    scala> convertArray(Array("bro"))
    res2: String = bro
    
    scala> convertArray(Array("bro", "dude"))
    res3: String = bro, dude
    

    【讨论】:

    • 我正在尝试将 convertArray 作为 udf 应用到 Dataframe 列。 val concatUdf = udf(convertArray)。并得到上面的 ClassCastException
    • @samba 然后请编辑您的答案,以添加相关呼叫。错误不在您的 convertArray 方法中,而是在调用它的代码中。 (您可能不会将 Array[String] 传递给您的方法,而是传递其他内容)
    • 是的,刚刚解决了。我应该使用 Seq:def convertArray(strings: Seq[String]): String = if (strings.nonEmpty) strings.mkString(", ") else "" 感谢分享您的知识
    【解决方案2】:

    只需使用 mkString,无需重新发明轮子:

     println(Array().mkString(", "))
     println(Array("hello").mkString(", "))
     println(Array("hello", "world").mkString(", "))
    

    输出:

    //empty string
    hello
    hello, world
    

    【讨论】:

      【解决方案3】:
      def convertArray(strings: Array[String]): String = Option(strings).getOrElse(Array()).mkString(", ")
      

      输出:

      scala> def convertArray(strings: Array[String]): String = Option(strings).getOrElse(Array()).mkString(", ") 
      convertArray: (strings: Array[String])String
      
      scala> convertArray(Array("to", "to", "ta", "ta")) 
      res16: String = to, to, ta, ta
      
      scala> convertArray(Array()) 
      res17: String = ""
      
      scala> convertArray(null) 
      res18: String = ""
      

      【讨论】:

        猜你喜欢
        • 2012-06-18
        • 1970-01-01
        • 1970-01-01
        • 2015-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多