2010-09-06 18 views
14

Supongamos que tengo dos listas:Encuentra elementos de una lista que no está en la segunda lista (en Scala)

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

Quiero conseguir el elemento que no está en la primera lista (en este caso es ' re'). Sé que puedo hacer esto con un ciclo, pero ¿hay alguna forma funcional y elegante para hacer esto rápidamente en una línea?

He estado mirando la API de la lista de Scala, pero solo pude encontrar la unión e intersección (que me dará Lista ('a', 'b', 'c', 'd') y Lista ('a ',' b ',' c ') respectivamente)

Respuesta

12

Creo que puede usar b -- a. Aquí está la documentación de 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 

Lo siento por el método en desuso, aquí es la corriente buena: list1 filterNot (list2 contains)

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

Lista [A] Selecciona todos los elementos de esta lista que no satisfacen un predicado. p el predicado utilizado para probar los elementos. devuelve una nueva lista que consta de todos los elementos de esta lista que no cumplen el predicado p dado. El orden de los elementos se conserva. clases de definición de: TraversableLike

+0

¡Gracias, eso funciona! Excepto en 2.8, aparentemente dijeron que estaba obsoleto y se eliminará gradualmente: OutputTree.scala: 136: method - in Class List está en desuso: use 'list1 filterNot (list2 contains)' en su lugar –

+1

¡ah, incluso copia y pega la nota de desaprobación! ¡Mi error! =) –

+0

No se preocupe, realmente no veo la línea en desuso, simplemente copiando todo :) – vodkhang

18

Se puede utilizar para este diff:

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

es probable que desee trabajar con Set si usted está haciendo diff.

0

Por supuesto, esto se puede hacer de muchas maneras. Para estructuras planas como lista de números y cadenas, diff es el más elegante. Otras formas son,

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 
Cuestiones relacionadas