Как разбить список по условию на два списка - PullRequest
0 голосов
/ 26 мая 2018

Я пытаюсь функционально написать тело для этой функции:

grouping[T](xs: List[T], rule: T => Boolean): Tuple2[List[T], List[T]]

, чтобы использовать его следующим образом:

println(grouping(List(1, 2, 100, 3, 4, 501, 12), (x: Int) => x >= 100))
println(grouping(List('A', 'C', 'Z', 'T', 'O', 'P', 'N', 'M', 'Y'), (x: 
Char) => x >= 'J'))

и получить:

(List(100, 501), List(1, 2, 3, 4, 12))
(List(Z, T, O, P, N, M, Y),List(A, C))

1 Ответ

0 голосов
/ 26 мая 2018

List предоставляет метод partition, который делает именно это:

List(1, 2, 100, 3, 4, 501, 12).partition(_ >= 100)

и возвращает:

(List(100, 501), List(1, 2, 3, 4, 12))

Из документация :

def section (p: (T) => Boolean): (List [T], List [T])

Разделение этой доступной коллекциив двух перемещаемых коллекциях в соответствии с предикатом.partition (p: (T) => Boolean): (List [T], List [T]) Делит эту перемещаемую коллекцию на две управляемые коллекции в соответствии с предикатом.


И мыможет инкапсулировать его в функцию, которая принимает предикат во входных данных:

def grouping[T](xs: List[T], rule: T => Boolean): (List[T], List[T]) = {
  xs.partition(rule)
}

, чтобы применить его следующим образом:

grouping(List(1, 2, 100, 3, 4, 501, 12), (i: Int) => i >= 100)
grouping(List('A', 'C', 'Z', 'T', 'O', 'P', 'N', 'M', 'Y'), (x: Char) => x >= 'J')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...