views:

113

answers:

2

Suppose I have two lists:

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

I want to get the element which is not in the first list (in this case it's 'd'). I know I can do this with a loop, but is there any fancy functional way to do this quickly in one line?

I've been looking at the Scala List API, but could only found union and intersection (which will give me List('a', 'b', 'c', 'd') and List('a', 'b', 'c') respectively)

+6  A: 

I think you can use b -- a. Here is the documentation from 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

Sorry for the deprecated method, here is the current good one: list1 filterNot (list2 contains)

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

List[A] Selects all elements of this list which do not satisfy a predicate. p the predicate used to test elements. returns a new list consisting of all elements of this list that do not satisfy the given predicate p. The order of the elements is preserved. definition classes: TraversableLike

vodkhang
Thank you, that works! Except in 2.8 apparently they said it's deprecated and will be phased out: OutputTree.scala:136: method -- in class List is deprecated: use `list1 filterNot (list2 contains)` instead
the_great_monkey
ah you even copy and pasted the deprecation note! My bad! =)
the_great_monkey
Don't worry, I don't really see the deprecated line, just copying the whole:)
vodkhang
+5  A: 

You can use diff for this:

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

You probably want to work with Set if you are doing diff.

olle kullberg