Scala类型不匹配-找到:所需单位:Array [String]

时间:2018-07-06 17:08:26

标签: scala type-mismatch databricks

我不明白为什么Scala在以下示例中抱怨类型错误:

def GetRanges(RangeString1: String): Array[String] = {
    val GetOneRange = "\\d+\\-\\d+".r;
    var AllRanges = new Array[String](0);
    if (!f_stringNullEmpty(RangeString1)) {
      GetOneRange.findAllIn(RangeString1).matchData.foreach(
        m => AllRanges = AllRanges ++ Array[String](m.group(0)) // Explicit casting to Array[String]
      )
    }
    return scala.util.Sorting.quickSort(AllRanges);
}

我收到的错误是:

 notebook:38: error: type mismatch;
 found   : Unit
 required: Array[String]
 return scala.util.Sorting.quickSort(AllRanges);
                                    ^

显然,遍历正则表达式结果并将其添加到数组中会导致类型更改。但为什么? 还是我错过了更基本的东西?

注意:我了解if语句返回类型Unit,因为未指定其他任何内容。但是我看不到那会影响数组的类型。

2 个答案:

答案 0 :(得分:1)

scala.util.Sorting.quickSort(AllRanges)的返回类型为Unit。但是,GetRanges需要Array[String]

def GetRanges(RangeString1: String): Array[String] = {
val GetOneRange = "\\d+\\-\\d+".r;

这里是quickSort,用于对数组进行排序

 /** Sort array `a` with quicksort, using the Ordering on its elements.
    * This algorithm sorts in place, so no additional memory is used aside from
    * what might be required to box individual elements during comparison.
    */
  def quickSort[K: Ordering](a: Array[K]): Unit = {
    // Must have iN >= i0 or math will fail.  Also, i0 >= 0.

答案 1 :(得分:0)

quickSort()到位对AllRanges进行突变并仅返回Unit,但是您已指定GetRanges()返回Array[String]就像quickSort()是返回Array(不是)。

您可以通过将代码更改为类似的代码来解决问题(nb。您无需指定return

scala.util.Sorting.quickSort(AllRanges)
AllRanges

FWIW,您还可以通过执行以下操作来避免使用f_stringNullEmpty和数组并置:

def getRanges(s: String): Array[String] = {
  val p = """\d+\-\d+""".r
  Option(s).filter(_.nonEmpty).map(p.findAllIn) match {
    case Some(matches) if matches.nonEmpty =>
      val m = matches.toArray[String]
      scala.util.Sorting.quickSort(m)
      m
    case _ =>
      Array.empty[String]
  }
}