Scala:和Lists中的结合

时间:2018-06-04 15:06:05

标签: scala functional-programming

所以我有result: List[List[Int]] = (List(0,1), List(0,1), List(1))并且我希望得到列表中每个元素的共同点(在本例中为1),就像逻辑AND连接一样。我怎么能这样做?

编辑:如果元素为空,则应返回空List,因为每个元素都没有共同的值

3 个答案:

答案 0 :(得分:2)

直观的方式

在每个子列表中,过滤掉所有子列表中包含的元素,然后展平并删除重复的:

val result1 = list.flatMap(_.filter(e => list.forall(_.contains(e)))).toSet

更有效的方式

找到最小的子列表并挑选每个子列表中的元素:

val result2 = list.minBy(_.size).filter(e => list.forall(_.contains(e))).toSet

数学方式

将每个子列表转换为一组并与它们相交:

val result3 = list.map(_.toSet).reduce(_.intersect(_))

答案 1 :(得分:1)

您可以使用intersect method

执行此操作
def intersection(lists: List[List[Int]]): List[Int] = {
  lists.headOption match {
    case Some(head) =>
      lists.foldLeft(head)((acc, l) => acc.intersect(l))
    case None => Nil
}

如果您将此方法用于Set而不是List

,该方法可能会更有效

答案 2 :(得分:1)

这里的难点是在空元素上进行交叉,在本例中为Set.empty。为了避免这种情况并在功能上更多地解决问题我们可以做到这一点

def uniqueElements(reults:List[List[Int]]):Set[Int] = {

  results match {
    case head1::head2::tail => head1.toSet intersect head2.toSet  intersect uniqueElements(tail)
    case head::Nil => head.toSet
    case Nil => Set.empty[Int]

  }
}