Найти элементы в списке, которых нет во втором списке (в Scala)
Предположим, у меня есть два списка:
val a = List('a', 'b', 'c')
val b = List('a', 'b', 'c', 'd')
Я хочу получить элемент, который не входит в первый список (в данном случае это 'd'). Я знаю, что могу сделать это с помощью цикла, но есть ли какой-нибудь фантастический функциональный способ сделать это быстро в одной строке?
Я смотрел API-интерфейс Scala, но мог найти только объединение и пересечение (которое даст мне List ('a', 'b', 'c', 'd') и List (' a ',' b ',' c ') соответственно)
Ответы
Ответ 1
Я думаю, вы можете использовать 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 предикат, используемый для тестирования элементов. возвращает новый список, состоящий из всех элементы этого списка, которые не удовлетворяют заданному предикату р. порядок элементов сохраняется. классы определения: TraversableLike
Ответ 2
Вы можете использовать diff
для этого:
scala> b diff a
res1: List[Char] = List(d)
Вероятно, вы хотите работать с Set
, если вы делаете diff
.
Ответ 3
Конечно, это можно сделать разными способами. Для плоских структур, таких как список чисел и строк 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