2013-04-16 8 views
32

mam ciąg jak poniżej:sprawdzenie, czy wartości w liście jest częścią String

val a = "some random test message" 

Mam listę takiego:

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

Teraz chcę, aby sprawdzić, czy ciąg a zawiera dowolne wartości z keys. Jak możemy to zrobić za pomocą funkcji wbudowanej biblioteki Scali?

(znam sposobu podziału a do listy, a następnie wykonaj test z keys liście, a następnie znaleźć rozwiązanie. Ale szukam sposobu rozwiązywania prościej za pomocą standardowych funkcji bibliotecznych.)

Odpowiedz

51

Coś takiego?

keys.exists(a.contains(_)) 

lub nawet więcej idiomatically

keys.exists(a.contains) 
+0

Lub 'klucze istnieją a.contains' – Eastsun

+2

W zależności od potrzeb OP, val keys = List("mess") da wynik fałszywie dodatni. keys.exists(a.split(' ').contains) może być dokładniejszy. – nadavwr

+2

To rozwiązanie jest świetne, ale trudno mi go zrozumieć. Czy możecie mi pomóc? – KirdApe

7

prostym przypadku jest test podciąg pojemników (jak zauważono w rarry jest odpowiedź), np

keys.exists(a.contains(_)) 

Nie powiedziałeś, czy chcesz zamiast tego znaleźć całe dopasowanie słów. Ponieważ odpowiedź rarry zakładała, że ​​tak nie jest, oto alternatywa, która zakłada, że ​​tak.

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 _) 

Należy pamiętać, że lista kluczy jest skuteczny tylko w przypadku małych list. Z listą, metoda contains zazwyczaj skanuje całą listę liniowo, dopóki nie znajdzie dopasowania lub nie osiągnie końca.

W przypadku większej liczby pozycji zestaw jest nie tylko preferowany, ale także stanowi bardziej prawdziwe odwzorowanie informacji. Zestawy są zazwyczaj zoptymalizowane za pomocą kodów hashowych itp. I dlatego wymagają mniej liniowego wyszukiwania - lub w ogóle żadnego.

+0

+1 dla podkreślenia użycia zestawów! – Sibi

Powiązane problemy