Найти элементы в списке, которого нет во втором списке (в Scala) - PullRequest
19 голосов
/ 06 сентября 2010

Предположим, у меня есть два списка:

val a = List('a', 'b', 'c')
val b = List('a', 'b', 'c', 'd')

Я хочу получить элемент, которого нет в первом списке (в данном случае это 'd'). Я знаю, что могу сделать это с помощью цикла, но есть ли какой-нибудь причудливый функциональный способ сделать это быстро в одной строке?

Я просматривал Scala List API, но смог найти только объединение и пересечение (что даст мне List ('a', 'b', 'c', 'd') и List ('a' , 'b', 'c') соответственно)

Ответы [ 3 ]

20 голосов
/ 06 сентября 2010

Вы можете использовать diff для этого:

scala> b diff a
res1: List[Char] = List(d)

Возможно, вы захотите работать с Set, если вы делаете diff.

13 голосов
/ 06 сентября 2010

Я думаю, вы можете использовать b -- a.Вот документация от scala:

def -- [B >: A] (that: List[B]) : List[B]
Computes the difference between this list and the given list that.
that
the list of elements to remove from this list.
returns this list without the elements of the given list that.
deprecated: use list1 filterNot (list2 contains) instead

Извините за устаревший метод, вот текущий хороший метод: list1 filterNot (list2 contains)

def filterNot (p: (A) ⇒ Boolean) :

Список [A] Выбирает все элементы этого списка, которые не удовлетворяют предикату.p предикат, используемый для проверки элементов.возвращает новый список, состоящий из всех элементов этого списка, которые не удовлетворяют данному предикату p.Порядок элементов сохраняется.определение классов: TraversableLike

0 голосов
/ 16 сентября 2016

Конечно, это можно сделать разными способами. Для плоских структур, таких как список чисел и строк diff является наиболее элегантным. Другие способы,

val ans1 = for { x <- b  if !a.contains(x) } yield x

val ans2 = for { x <- b if !a.exists(_ == x) } yield x

val ans3 = b filterNot (x => b.contains(x) )

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