Как разбить последовательность на два списка с помощью предиката?
Альтернатива: я могу использовать filter
и filterNot
или написать свой собственный метод, но разве нет более общего (встроенного) метода лучше?
Используя partition
метод:
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)
это способ уничтожить результирующий кортежpartition
в удобочитаемом виде._ % 2 == 0
.Хорошо , что
partition
было то , что вы хотели - есть еще один метод , который также использует предикат разделить список на две части :span
.Первый, partition поместит все «истинные» элементы в один список, а остальные - во второй.
span поместит все элементы в один список до тех пор, пока элемент не станет «ложным» (с точки зрения предиката). С этого момента он поместит элементы во второй список.
источник
Возможно, вы захотите взглянуть на scalex.org - он позволяет вам искать в стандартной библиотеке scala функции по их сигнатуре. Например, введите следующее:
Вы увидите раздел .
источник
Вы также можете использовать foldLeft, если вам нужно что-то дополнительное. Я просто написал такой код, когда раздел его не вырезал:
источник
Я знаю, что могу опоздать на вечеринку, и есть более конкретные ответы, но вы могли бы использовать
groupBy
Это делает ваш код более ориентированным на будущее, если вам нужно изменить условие на что-то не логическое.
источник
Если вы хотите разбить список более чем на 2 части и игнорировать границы, вы можете использовать что-то вроде этого (измените, если вам нужно искать ints)
источник