2013-04-16 5 views
32

ho una stringa come questa:Verificando valori in List è parte della stringa

val a = "some random test message" 

Ho una lista come questa:

val keys = List("hi","random","test") 

Ora, voglio verificare se la stringa a contiene qualsiasi valore da keys. Come possiamo farlo usando le funzioni di libreria integrate di Scala?

(So che il modo di dividere a di lista e poi fare un controllo con keys lista e poi trovare la soluzione. Ma sto cercando un modo per risolvere in modo più semplice utilizzando le funzioni di libreria standard.)

risposta

51

Qualcosa come questo?

keys.exists(a.contains(_)) 

O ancora più idiomaticamente

keys.exists(a.contains) 
+0

O 'chiavi esiste a.contains' – Eastsun

+2

A seconda delle necessità dell'OP, val keys = List("mess") produrrà quello che potrebbe essere un falso positivo. keys.exists(a.split(' ').contains) potrebbe essere più preciso. – nadavwr

+2

Questa soluzione è ottima ma ho difficoltà a capirlo. Potresti aiutarmi? – KirdApe

7

Il caso semplice è quello di testare sottostringa contenimento (come osservato in risposta rarry s'), ad esempio

keys.exists(a.contains(_)) 

Non hai detto se effettivamente vuoi trovare intere corrispondenze intere. Dal momento che la risposta di rarry non è stata accettata, ecco un'alternativa che si presuppone che tu faccia.

val a = "some random test message" 
val words = a.split(" ") 
val keys = Set("hi","random","test") // could be a List (see below) 
words.exists(keys contains _) 

Tenete a mente che l'lista di chiavi è efficiente solo per piccole liste. Con un elenco, il metodo contains esegue generalmente la scansione dell'intero elenco in modo lineare fino a quando non trova una corrispondenza o raggiunge la fine.

Per un numero maggiore di elementi, un set non è solo preferibile, ma è anche una rappresentazione più fedele delle informazioni. Gli insiemi sono in genere ottimizzati tramite hashcodes ecc. E quindi richiedono meno ricerche lineari o niente affatto.

+0

+1 per enfatizzare l'uso degli Insiemi! – Sibi