Encuentre elementos en una lista que no esté en la segunda lista(en scala)
scala list (3)
Supongamos que tengo dos listas:
val a = List(''a'', ''b'', ''c'')
val b = List(''a'', ''b'', ''c'', ''d'')
Quiero obtener el elemento que no está en la primera lista (en este caso es ''d''). Sé que puedo hacer esto con un bucle, pero ¿hay alguna forma funcional elegante de hacerlo rápidamente en una línea?
He estado buscando en la Lista de Scala, pero solo pude encontrar unión e intersección (lo que me dará la Lista (''a'', ''b'', ''c'', ''d'') y la Lista (''a'', ''b '','' c '') respectivamente)
Creo que puedes 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í está el bueno actual: 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 elementos. devuelve una nueva lista que consta de todos los elementos de esta lista que no satisfacen el predicado dado p. El orden de los elementos se conserva. Clases de definición: TraversableLike
Por supuesto, esto se puede hacer de muchas maneras. Para estructuras planas como la lista de números y cadenas es la 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
Puedes usar diff
para esto:
scala> b diff a
res1: List[Char] = List(d)
Probablemente quieras trabajar con Set
si estás haciendo diff
.