132

述語によってシーケンスを 2 つのリストに分割するにはどうすればよいですか?

filter代替案: andを使用するfilterNotか、独自のメソッドを作成できますが、より一般的な (組み込みの) メソッドはありませんか?

4

6 に答える 6

211

メソッドを使用してpartition

scala> List(1,2,3,4).partition(x => x % 2 == 0)
res0: (List[Int], List[Int]) = (List(2, 4),List(1, 3))
于 2012-08-27T19:50:10.273 に答える
146

それpartitionはあなたが望んでいたことでした.述語を使用してリストを2つに分割する別の方法もあります: span.

最初のpartitionは、すべての「真」の要素を 1 つのリストに入れ、他の要素を 2 番目のリストに入れます。

spanは、要素が (述語に関して) 「false」になるまで、すべての要素を 1 つのリストに入れます。その時点から、2 番目のリストに要素が配置されます。

scala> Seq(1,2,3,4).span(x => x % 2 == 0)
res0: (Seq[Int], Seq[Int]) = (List(),List(1, 2, 3, 4))
于 2012-08-28T03:20:08.350 に答える
17

scalex.orgを参照してください。これにより、scala 標準ライブラリで関数のシグネチャを検索できます。たとえば、次のように入力します。

List[A] => (A => Boolean) => (List[A], List[A])

partitionが表示されます。

于 2012-08-27T23:30:16.650 に答える
0

リストを 2 つ以上の部分に分割し、境界を無視する場合は、次のようなものを使用できます (int を検索する必要がある場合は変更してください)。

def split(list_in: List[String], search: String): List[List[String]] = {
  def split_helper(accum: List[List[String]], list_in2: List[String], search: String): List[List[String]] = {
    val (h1, h2) = list_in2.span({x: String => x!= search})
    val new_accum = accum :+ h1
    if (h2.contains(search)) {
      return split_helper(new_accum, h2.drop(1), search) 
    }
    else {
    return accum
    }
  }
  return split_helper(List(), list_in, search)
}

// TEST

// split(List("a", "b", "c", "d", "c", "a"), {x: String => x != "x"})
于 2014-10-15T23:07:15.920 に答える