首页 > 解决方案 > 为什么Scala返回一个';' 预期但“,”发现错误?

问题描述

我目前正在尝试使用有效的合并排序算法在 Scala 中编写反转计数算法。

合并排序按预期运行,但是当我尝试将计数添加为参数之一时,我得到了错误:

Error:(14, 29) ';' expected but ',' found.
      case (_, Nil) => left, count
                           ^

这是程序:

object MergeSort {

  def mergeSort(inputList: List[Int]): List[Int] = {

    if (inputList.length <= 1) inputList

    else {
      val (left, right) = inputList.splitAt(inputList.size / 2)
      merge(mergeSort(left), mergeSort(right), 0)
    }

  }

  def merge(left: List[Int], right: List[Int], count: Int): List[Int] =
    (left, right) match {
      case (_, Nil) => left, count
      case (Nil, _) => right, count
      case (leftHead :: leftTail, rightHead :: rightTail) =>
        if (leftHead < rightHead){
          val (leftList, leftCount) = leftHead :: merge(leftTail, right, count)
          return (leftList, leftCount)
        }
        else {
          val (rightList, rightCount) = rightHead :: merge(left, rightTail, count)
          val mergeInversions = leftCount + left.length
          return (rightList, mergeInversions)
        }
    }

  val inputList: List[Int] = List(10, 3, 5, 1, 7, 6)

  val sorted_arr = mergeSort(inputList)

}

标签: scala

解决方案


@sepp2k 在评论中正确指出,如果你想创建一个元组,那么你需要用括号括起来。

这是工作解决方案:

object MergeSort {

  def mergeSort(inputList: List[Int]): List[Int] = {

    if (inputList.length <= 1) inputList
    else {
      val (left, right) = inputList.splitAt(inputList.size / 2)
      merge(mergeSort(left), mergeSort(right), 0)._1
    }

  }

  def merge(left: List[Int], right: List[Int], count: Int): (List[Int], Int) =
    (left, right) match {
      case (_, Nil) => (left, count)
      case (Nil, _) => (right, count)
      case (leftHead :: leftTail, rightHead :: rightTail) =>
        if (leftHead < rightHead) {
          val left = merge(leftTail, right, count)
          val (leftList, leftCount) = (leftHead :: left._1, left._2)
          (leftList, leftCount)
        } else {
          val right = merge(left, rightTail, count)
          val (rightList, rightCount) = (rightHead :: right._1, right._2)
          val mergeInversions = rightCount + left.length
          (rightList, mergeInversions)
        }
    }

  val inputList: List[Int] = List(10, 3, 5, 1, 7, 6, 0)

  val sorted_arr = mergeSort(inputList)
}

推荐阅读