Scala: И соединение в списках - PullRequest
0 голосов
/ 04 июня 2018

Итак, у меня есть result: List[List[Int]] = (List(0,1), List(0,1), List(1)), и я хочу получить числа, которые у каждого элемента списка есть общие (в данном случае 1), как логическое соединение И.Как я могу это сделать?

Редактировать: Если элемент пуст, он должен возвращать пустой список, потому что нет никаких значений, общих для каждого элемента

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

Интуитивно понятный способ

В каждом подсписке отфильтруйте элементы, содержащиеся во всех подсписках, затем выровняйте и удалите дубликаты:

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(_))
0 голосов
/ 05 июня 2018

Сложность заключается в том, чтобы сделать пересечение на пустом элементе, в данном случае 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]

  }
}
0 голосов
/ 04 июня 2018

Вы можете сделать это с помощью метода intersect :

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...