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

あなたは一致したくない、あなたは見つけたい:

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最初のリストのためだけに。探しているサブリストが明確ではなかったので、最初のサブリストを想定しました。それ以外の場合は、find-callに使用される述語を調整する必要があります。

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

別の「解決策」:

質問は十分に明確ではありません。レックスが指摘したように、マッチステートメントを使用すると、遠くまで行くことはありません。上記の最小限の例(宿題に必要なすべてである可能性があります)のみを満たすために、正確なリストを一致させることができます。つまり、リストの3番目の要素を正確にハードコーディングできます。その場合、次のように書くことができます。

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

これはほとんど意味がありませんが、必要なアサーションを解決するので、せいぜい::リストを作成するための使用法の練習になります。

于 2012-04-18T12:39:34.880 に答える