2010-09-06 13 views
14

Angenommen, ich habe zwei Listen nicht in der zweiten Liste ist:Finden Elemente in einer Liste, die (in scala)

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

ich nicht in der ersten Liste will, um das Element zu erhalten, die (in diesem Fall ist es " d '). Ich weiß, dass ich das mit einer Schleife machen kann, aber gibt es irgendeine raffinierte funktionale Möglichkeit, dies schnell in einer Zeile zu machen?

Ich habe mir die Scala List API angeschaut, aber konnte nur union und intersection finden (was mir List ('a', 'b', 'c', 'd') und List ('a ',' b ',' c ') bzw.)

Antwort

12

Ich denke, Sie können b -- a verwenden. Hier ist die Dokumentation von 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 für die veraltete Methode, hier ist die aktuelle gute: list1 filterNot (list2 contains)

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

Liste [A] Wählt alle Elemente dieser Liste die kein Prädikat erfüllen. p das zum Testen von Elementen verwendete Prädikat. gibt eine neue Liste zurück, die aus allen Elementen dieser Liste besteht, die das gegebene Prädikat p nicht erfüllen . Die Reihenfolge der Elemente bleibt erhalten. Definition Klassen: TraversableLike

+0

Vielen Dank, das funktioniert! Außer in 2.8 haben sie anscheinend gesagt, dass es veraltet ist und auslaufen wird: OutputTree.scala: 136: method - in class Liste ist veraltet: benutze 'list1 filterNot (list2 enthält)' anstatt –

+1

ah du hast sogar den deprecation note kopiert und eingefügt! Mein Fehler! =) –

+0

Mach dir keine Sorgen, ich sehe nicht die veraltete Zeile, nur das ganze kopieren :) – vodkhang

18

Sie diff dafür verwenden können:

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

Sie wollen wahrscheinlich mit Set arbeiten, wenn Sie diff tun.

0

Natürlich kann dies auf viele Arten erfolgen. Für flache Strukturen wie Liste der Zahlen und Strings diff ist die eleganteste. Andere Möglichkeiten sind,

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 
Verwandte Themen