如何通过谓词将序列分成两部分?

Joh*_*ood 111 scala

如何通过谓词将序列拆分为两个列表?

替代方案:我可以使用filterfilterNot编写自己的方法,但是没有更好的更通用(内置)方法吗?

om-*_*nom 180

通过使用partition方法:

scala> List(1,2,3,4).partition(x => x % 2 == 0)
res0: (List[Int], List[Int]) = (List(2, 4),List(1, 3))
Run Code Online (Sandbox Code Playgroud)

  • `val (even, odd) = List(1,2,3,4).partition(x => x % 2 == 0)` 是一种以可读的方式破坏 `partition` 的结果元组的方法。 (2认同)
  • 我们可以将分区内的函数缩短为“_ % 2 == 0”。 (2认同)

Dan*_*ral 135

好的partition就是你想要的东西 - 还有另一种方法也使用谓词将列表分成两部分:span.

第一个,分区将所有"true"元素放在一个列表中,其他元素放在第二个列表中.

span将把所有元素放在一个列表中,直到元素为"false"(就谓词而言).从那时起,它将把元素放在第二个列表中.

scala> Seq(1,2,3,4).span(x => x % 2 == 0)
res0: (Seq[Int], Seq[Int]) = (List(),List(1, 2, 3, 4))
Run Code Online (Sandbox Code Playgroud)

  • 正是我在寻找什么.当列表按相关标准排序时,这更有意义. (2认同)

oxb*_*kes 15

您可能需要查看scalex.org - 它允许您通过签名搜索scala标准库以查找函数.例如,键入以下内容:

List[A] => (A => Boolean) => (List[A], List[A])
Run Code Online (Sandbox Code Playgroud)

你会看到分区.

  • scalex.org域名目前已死亡.但还有另一种选择 - http://scala-search.org/ ;-). (10认同)
  • @monnef 2020 年有什么替代方案吗?:) (3认同)
  • 没有其他选择:(。2020...是最糟糕的 (2认同)

nai*_*rbv 14

如果您需要额外的东西,也可以使用foldLeft.我只是在分区没有剪切时写了一些这样的代码:

val list:List[Person] = /* get your list */
val (students,teachers) = 
  list.foldLeft(List.empty[Student],List.empty[Teacher]) {
    case ((acc1, acc2), p) => p match {
      case s:Student => (s :: acc1, acc2)
      case t:Teacher  => (acc1, t :: acc2)
    }
  }
Run Code Online (Sandbox Code Playgroud)