シーケンスを述語によって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))
_ % 2 == 0
ます。
良いことpartition
でしたspan
。リストを2つに分割するために述語も使用する別の方法があります。
最初のパーティションは、すべての「真の」要素を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を見てみたいかもしれません-それはあなたがそれらのシグネチャによって関数のためにスカラ標準ライブラリを検索することを可能にします。たとえば、次のように入力します。
List[A] => (A => Boolean) => (List[A], List[A])
パーティションが表示されます。
少し余分なものが必要な場合は、foldLeftを使用することもできます。パーティションがそれをカットしなかったとき、私はちょうどこのようないくつかのコードを書きました:
val list:List[Person] = /* get your list */
val (students,teachers) =
list.foldLeft(List.empty[Student],List.empty[Teacher]) {
case ((acc1, acc2), p) => p match {
case s:Student => (s :: acc1, acc2)
case t:Teacher => (acc1, t :: acc2)
}
}
私はパーティーに遅れる可能性があることを知っています、そしてより具体的な答えがありますが、あなたはうまく活用することができます groupBy
val ret = List(1,2,3,4).groupBy(x => x % 2 == 0)
ret: scala.collection.immutable.Map[Boolean,List[Int]] = Map(false -> List(1, 3), true -> List(2, 4))
ret(true)
res3: List[Int] = List(2, 4)
ret(false)
res4: List[Int] = List(1, 3)
これにより、条件をブール値以外の何かに変更する必要がある場合に、コードの将来性が少し高まります。
リストを3つ以上に分割し、境界を無視する場合は、次のようなものを使用できます(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"})
val (even, odd) = List(1,2,3,4).partition(x => x % 2 == 0)
結果のタプルをpartition
読み取り可能な方法で破棄する方法です。