述語によってシーケンスを 2 つのリストに分割するにはどうすればよいですか?
filter
代替案: andを使用するfilterNot
か、独自のメソッドを作成できますが、より一般的な (組み込みの) メソッドはありませんか?
述語によってシーケンスを 2 つのリストに分割するにはどうすればよいですか?
filter
代替案: andを使用するfilterNot
か、独自のメソッドを作成できますが、より一般的な (組み込みの) メソッドはありませんか?
メソッドを使用してpartition
:
scala> List(1,2,3,4).partition(x => x % 2 == 0)
res0: (List[Int], List[Int]) = (List(2, 4),List(1, 3))
それ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))
scalex.orgを参照してください。これにより、scala 標準ライブラリで関数のシグネチャを検索できます。たとえば、次のように入力します。
List[A] => (A => Boolean) => (List[A], List[A])
partitionが表示されます。
リストを 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"})