2

我需要使用模式匹配查找子列表,我该怎么做?

val list1 = List(2, 3)
val list2 = List(1, "2", list1, "r")
val list3 = list2 match {
      case // insert match statement here
      case _ => "failed"
}

assertEquals(list1, list3)

我无法更改给定的代码,我只能在此处插入代码, case // insert match statement here 这是学校任务(不是工作)

4

2 回答 2

4

你不想要一个match,你想要一个find

list2.find(_ == list1)

会给你一个Some(List(2, 3))(或者None如果它找不到)。要完全匹配您的代码,您需要:

list2.find(_ == list1).getOrElse("failed")

尽管使用Option而不是可能的字符串是处理错误情况的更好方法。

如果你真的想使用匹配,你必须递归地做:

final def findOrFailed(xs: List[Any], what: Any): Any = xs match {
  case x :: rest => if (x == what) x else findOrFailed(rest,what)
  case _ => "failed"
}

(同样,我更喜欢一个选项,但我在这里给出了字符串版本。)

于 2012-04-18T12:40:33.250 回答
2

干得好。仅.find用于第一个列表。由于您不清楚您正在寻找哪个子列表,我只是假设第一个。否则,您必须调整用于查找调用的谓词。

val list1 = List(2, 3)
val list2 = List(1, "2", list1, "r")
val list3 = list2.find(_.isInstanceOf[List[_]]) match {
      case Some(listFound) => listFound
      case _ => "failed"
}

assertEquals(list1, list3) // true

另一个“解决方案”:

问题不够清楚。正如 Rex 指出的那样,使用 match 声明,您不会走得太远。为了只满足上面的最小示例(这可能是家庭作业所需的全部),您可以匹配确切的列表。即你可以硬编码你想要列表的第三个元素。在这种情况下,您可以编写如下内容:

case x :: y :: mylist :: rest => mylist

这几乎没有任何意义,但解决了所需的断言,所以充其量是一个练习::用于构造列表。

于 2012-04-18T12:39:34.880 回答