2013-04-29 19 views
21

Ho due liste:differenza Scala di due liste

val list1 = List("word1","word2","word2","word3","word1") 
val list2 = List("word1","word4") 

Voglio rimuovere tutte le occorrenze di list2 elementi da list1, cioè voglio

List("word2","word2","word3") <= list1 *minus* list2 

ho fatto list1 diff list2 che mi dà List("word2","word2","word3","word1") che sta rimuovendo solo la prima occorrenza di "word1".

Non riesco a convertirlo in set perché ho bisogno di conoscere i duplicati (vedere "word2" sopra). Cosa fare?

risposta

43

È possibile

val unwanted = list2.toSet 
list1.filterNot(unwanted) 

per rimuovere tutti gli elementi in list2. (Non avete bisogno di conoscenze di duplicati in list2.)

+0

Impressionante! Grazie –

+0

Perché 'cattivo'? Gli insiemi non sono male di per sé. –

+2

Penso che significhi solo "indesiderato" - gli elementi che non si desidera nell'elenco risultante. – AmigoNico

6

Si potrebbe provare questo:

val list1 = List("word1","word2","word2","word3","word1") 
val list2 = List("word1","word4") 

println(list1.filterNot(list2.contains(_))) 
+2

L'operazione contiene su list2 è inefficiente: eseguirà una scansione lineare per ogni elemento di list1, quindi nel ciclo interno sono presenti n x m iterazioni. Il test di contenimento è migliore di quello degli elenchi per qualsiasi set non banale poiché utilizza innanzitutto confronti con codice hash per eliminare la maggior parte dei casi e verifica solo l'uguaglianza delle stringhe nel numero ridotto di casi rimanenti, se presenti. (Quanto è buono dipende dall'algoritmo di hash in uso). –

+0

Grazie @ Rick-777. Ciò ha senso. – cmbaxter

+0

Set è più efficiente, ma non conserva l'ordine. Se c'è un set che conserva l'ordine, mi piacerebbe usarlo per il mio caso – ayvango