2012-04-12 17 views
49

Mam dwa ciągi w scala i chcę się dowiedzieć, czy większy ciąg (needle) zawiera mniejszy ciąg (haystack).Jaki jest idiomatyczny sposób wyszukiwania scala, jeśli dany ciąg zawiera dany podciąg?

Co znalazłem to robi z wyrażeń regularnych i pasuje tak (from this question):

needle.r.pattern.matcher(haystack).matches

jest (1) rażąco nadmiernie skomplikowane dla takiego prostego problemu, ale co ważniejsze, (2) nie robi „t dla mnie pracować, ponieważ

"needle".r.pattern.matcher("Finding needle in haystack").matches

powraca

Boolean = false

+7

ja może czegoś brakuje, ale to, co się stało z zawiera? – JaimeJorge

+0

Właśnie miałem zapytać o to samo – covertCoder

+3

Nie ma w tym nic złego, po prostu go nie znalazłem :) to wszystko. –

Odpowiedz

88

Jeśli chcesz zrobić to z maksymalną wydajnością, być może będziesz musiał napisać to sam (lub znaleźć gdzieś dobry algorytm wyszukiwania podłańcuchowego). Jeśli chcesz po prostu go do pracy w ogóle, to w Scala:

scala> "Finding needle in haystack" contains "needle" 
res0: Boolean = true 

scala> "Finding needle in haystack" indexOf "needle" 
res1: Int = 8 

nie regex wyszukiwania. Nie używasz poprawnie dopasowania do wyrażenia regularnego (edytuj: ponieważ ten kod wymaga dokładnego dopasowania do całego ciągu, a nie do znalezienia pasującego podciągu), ale jest to inny problem. Jeśli chcesz zliczenie liczby meczów, można zrobić coś takiego

scala> "needle".r.findAllIn("Finding needle in haystack").length 
res2: Int = 1 
+7

Jeśli ktoś się zastanawia, 'zawiera' i' indexOf' są tylko metodami 'java.lang.String' i nie ma tutaj żadnej magii Scala. Nie spojrzałem na źródło, ale spodziewam się, że są to dobrze zoptymalizowane metody. –

+0

Co jest takiego powolnego lub nieoptymalizowanego? – matanster

13

Chociaż odpowiedział pomyślałem, że również ten regex styl

scala> "I have a needle in my haystack" matches ".*needle.*" 
res10: Boolean = true 
+1

To jest powolne i działa tylko wtedy, gdy nie ma terminatorów linii. –

+0

powolny w porównaniu do czego? –

+1

W porównaniu do innej odpowiedzi. indexOf() (który zawiera() używa) jest dobrze zoptymalizowany zarówno na poziomie Java, jak iw JVM. –

Powiązane problemy