Como faço para dividir uma sequência em duas listas por um predicado?
Alternativa: Eu posso usar filter
e filterNot
, ou escrever meu próprio método, mas não existe um método mais geral (integrado) melhor?
Usando o 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)
é uma maneira de destruir a tupla resultante departition
de uma forma legível._ % 2 == 0
.Bem que
partition
foi a coisa que você queria - não há outro método que também utiliza um predicado para dividir uma lista em duas:span
.O primeiro, partição , colocará todos os elementos "verdadeiros" em uma lista e os outros na segunda lista.
span irá colocar todos os elementos em uma lista até que um elemento seja "falso" (em termos do predicado). Desse ponto em diante, ele colocará os elementos da segunda lista.
fonte
Você pode querer dar uma olhada em scalex.org - ele permite que você pesquise na biblioteca padrão do scala por funções por sua assinatura. Por exemplo, digite o seguinte:
Você veria partição .
fonte
Você também pode usar o foldLeft se precisar de algo um pouco mais. Acabei de escrever um código como este quando a partição não o cortou:
fonte
Sei que posso chegar atrasado para a festa e há respostas mais específicas, mas você poderia fazer bom uso de
groupBy
Isso torna seu código um pouco mais preparado para o futuro se você precisar alterar a condição para algo não booleano.
fonte
Se você quiser dividir uma lista em mais de 2 partes e ignorar os limites, pode usar algo como isto (modifique se precisar pesquisar por ints)
fonte