Scala列表和拆分

时间:2014-11-15 13:01:50

标签: scala

我有一个家庭作业,让我们使用一个列表并将其分成两部分,第一部分中的元素不大于p,第二部分中的元素大于p。所以它就像一个快速的排序,除了我们不能使用任何排序。我真的需要一些如何解决这个问题的技巧。我知道我使用了案例,但我不熟悉列表类在scala中的工作方式。以下是我到目前为止所做的,但不确定如何分割2个列表。

使用

 def split(p:Int, xs:List[Int]): List[Int] = {

 xs match {
   case Nil => (Nil, Nil)
   case head :: tail =>
 }

1 个答案:

答案 0 :(得分:2)

首先,您希望split返回一对列表,因此返回类型必须为(List[Int], List[Int])。但是,一起使用对和列表通常意味着经常分解返回值。您可能希望有一个辅助功能为您做繁重的工作。

例如,您的辅助函数可能会被赋予两个列表,最初为空,并构建内容,直到第一个列表为空。结果将是一对列表。

接下来你需要在递归函数设计中做出决定,"关键决策是什么?"在您的情况下,它的值不超过p"。这导致以下代码:

def split(p:Int, xs: List[Int]): (List[Int], List[Int]) = {
  def splitAux(r: List[Int], ngt: List[Int], gt: List[Int]): (List[Int], List[Int]) =
    r match {
      case Nil => (ngt, gt)
      case head :: rest if head <= p =>
        splitAux(rest, head :: ngt, gt)
      case head :: rest if head > p =>
        splitAux(rest, ngt, head :: gt)
    }
  val (ngt, gt) = splitAux(xs, List(), List())
  (ngt.reverse, gt.reverse)
}

逆转步骤并非严格必要,但可能最不令人惊讶。类似地,第二个保护谓词明确表示正在采取的路径。

但是,有一种更简单的方法:使用内置功能。<​​/ p>

def split(p:Int, xs: List[Int]): (List[Int], List[Int]) = {
  (xs.filter(_ <= p), xs.filter(_ > p))
}

filter仅提取符合条件的项目。此解决方案将列表移动两次,但由于您在上一个解决方案中有reverse步骤,因此无论如何都要这样做。

相关问题