Więc mam result: List[List[Int]] = (List(0,1), List(0,1), List(1)) i chcę uzyskać liczby każdego elementu listy wspólnej (w tym przypadku 1) jak logiczne i koniunkcyjne. Jak mogę to zrobić?

Edytuj: Jeśli element jest pusty, powinien zwrócić pustą listę, ponieważ nie ma wartości każdego elementu

1
Melkor 4 czerwiec 2018, 18:06

3 odpowiedzi

Najlepsza odpowiedź

intuicyjny sposób

W każdym Subistic, odfiltrować elementy zawarte we wszystkich sufistów, a następnie spłaszczają i usuń zduplikowane:

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

bardziej wydajny sposób

Znajdź najmniejszy Subsist i wybrać elementy, które są w każdym Subist:

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

sposób matematyczny

Zamień każdy suboblist do zestawu i przecinają je:

val result3 = list.map(_.toSet).reduce(_.intersect(_))
2
slouc 4 czerwiec 2018, 15:32

Możesz to zrobić za pomocą intersect Metoda:

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
}

Metoda może być bardziej wydajna, jeśli używasz go za pomocą Set zamiast List

1
vdebergue 4 czerwiec 2018, 15:22

Trudność jest wykonanie przecięcia na pustym elemencie, w tym przypadku Set.empty. Aby tego uniknąć i rozwiązywać problem bardziej funkcjonalnie, możemy to zrobić

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]

  }
}
1
Rachid Ait Abdesselam 6 czerwiec 2018, 08:07