所以我有result: List[List[Int]] = (List(0,1), List(0,1), List(1))
并且我希望得到列表中每个元素的共同点(在本例中为1),就像逻辑AND连接一样。我怎么能这样做?
编辑:如果元素为空,则应返回空List,因为每个元素都没有共同的值
答案 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]
}
}