¿Cómo divido una secuencia en dos listas por un predicado?
Alternativa: puedo usar filter
y filterNot
, o escribir mi propio método, pero ¿no hay un método mejor más general (integrado)?
Usando el partition
método:
scala> List(1,2,3,4).partition(x => x % 2 == 0)
res0: (List[Int], List[Int]) = (List(2, 4),List(1, 3))
val (even, odd) = List(1,2,3,4).partition(x => x % 2 == 0)
es una forma de destruir la tupla resultante departition
de forma legible._ % 2 == 0
.Bien que
partition
era lo que quería - no hay otro método que también usa un predicado para dividir una lista en dos:span
.La primera, la partición pondrá todos los elementos "verdaderos" en una lista y los demás en la segunda lista.
span pondrá todos los elementos en una lista hasta que un elemento sea "falso" (en términos del predicado). A partir de ese momento, colocará los elementos en la segunda lista.
fuente
Es posible que desee echar un vistazo a scalex.org : le permite buscar funciones en la biblioteca estándar de scala por su firma. Por ejemplo, escriba lo siguiente:
Vería la partición .
fuente
También puede usar foldLeft si necesita algo un poco más. Acabo de escribir un código como este cuando la partición no lo cortó:
fuente
Sé que podría llegar tarde a la fiesta y hay respuestas más específicas, pero podrías hacer un buen uso de
groupBy
Esto hace que su código esté un poco más preparado para el futuro si necesita cambiar la condición a algo que no sea booleano.
fuente
Si desea dividir una lista en más de 2 partes e ignorar los límites, puede usar algo como esto (modifíquelo si necesita buscar entradas)
fuente