如何按条件将列表拆分为两个列表

时间:2018-05-26 10:18:23

标签: scala list functional-programming pattern-matching folding

我试图以功能方式编写此函数的正文:

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 :(得分:1)

List提供了partition方法,它就是这样做的:

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

并返回:

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

来自documentation

  

def partition(p:(T)=>布尔):( 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')