0

次のように、タイプ Option[String] の入力を Option[Array[String]] に分割しています。

val input:Option[String] = Option("a=b,1000,what?")
val result: Option[Array[String]] = input map { _.split(",") }

配列のいずれかのメンバーが一致する場合 (たとえば、0 未満の Long である場合)、配列全体が破棄され、空の Option が返されるというテストを追加したいと考えています。

4

3 に答える 3

3
  1. filterのコンテンツに対してテストを実行するために使用しますOption
  2. existsコレクションのいずれかのメンバーが条件を満たしているかどうかを確認するために使用します。

result.filter(! _.exists(s => test(s)))

また

result.filterNot(_.exists(s => test(s)))
于 2012-10-26T08:48:13.113 に答える
1

find()コレクションでの使用を検討しましたか? が返された場合Some(x)、何かが条件を満たしています。

list.find(_ < 0) match {
   case Some(x) => None
   case None => Some(list)
}
于 2012-10-26T08:46:36.207 に答える
0

もちろん、@ ziggystar が示唆するように分割してからフィルタリングできることは知っていますが、非常に大きなString要素があり、最初の要素が一致する場合、文字列が破棄されることがわかっているときに文字列の分割を終了しても意味がありません。

この場合、時間効率が心配な場合は、次のように を使用しStreamて分割操作を再実装できます。

def result(input:Option[String]):Option[Seq[String]] = {
  def split(c: Char, chars:Stream[Char]):Stream[String] = {
    val (head,tail) = chars span(_ != c)
    head.mkString #:: (if(tail isEmpty) Stream.empty else split(c, tail tail))
  }

  input map {s => split(',', Stream(s:_*)) } filter (_.forall (s => !test(s)))
}

マップ/フィルター構造は同じままですが、 の使用により短絡していることに注意してくださいStream

それが非常に大きな文字列である場合は、おそらくStream[Char]すでにそれを持っています。つまり、元の文字列にぶら下がっているメモリオーバーヘッドさえありません。

于 2012-10-26T14:34:21.310 に答える