2012-04-12 18 views
49

Ich habe zwei Zeichenfolgen in scala und ich möchte herausfinden, ob die größere Zeichenfolge (needle) eine kleinere Zeichenfolge enthält (haystack).Was ist der idiomatische scala Weg zu finden, wenn eine gegebene Zeichenkette eine gegebene Teilkette enthält?

Was ich fand, ist es mit regexps tun und passt wie folgt aus (from this question):

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

die (1) grob zu kompliziert für ein solches einfaches Problem, aber was noch wichtiger ist, (2) doesn ‚t Arbeit für mich, weil

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

kehrt

+7

Ich bin vielleicht etwas fehlt, aber Was ist falsch mit enthält? – JaimeJorge

+0

Ich war gerade dabei, das gleiche zu fragen – covertCoder

+3

Es ist nichts falsch daran, ich habe es einfach nicht gefunden :) das ist alles. –

Antwort

88

Wenn Sie es mit maximaler Effizienz tun möchten, müssen Sie es möglicherweise selbst schreiben (oder finden Sie einen guten Teilstringsuchalgorithmus irgendwo). Wenn Sie nur wollen, dass es überhaupt arbeiten, dann in Scala:

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

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

Dies sind nicht Regex sucht. Sie verwenden die Regex-Übereinstimmung auch nicht korrekt (edit: weil der Code nach einer genauen Übereinstimmung mit der ganzen Zeichenfolge fragt, um keine passende Teilzeichenfolge zu finden), aber das ist ein anderes Problem. Wenn Sie eine Zählung der Anzahl der Spiele wollen, können Sie so etwas wie

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

Wenn jemand sich fragt, 'contains' und' indexOf' sind nur Methoden auf 'java.lang.String' und es gibt hier keine Scala-Magie. Ich habe mir die Quelle nicht angesehen, aber ich erwarte, dass sie gut optimierte Methoden sind. –

+0

Und was ist so langsam oder nicht optimiert über sie? – matanster

13

tun Obwohl antwortete ich dachte, dass ich auch diese regex Stil bieten würde

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

Dies ist langsam und funktioniert nur, wenn keine Abschlusswiderstände vorhanden sind. –

+0

langsam im Vergleich zu was? –

+1

Verglichen mit der anderen Antwort. indexOf() (welches() enthält) ist sowohl auf Java-Ebene als auch innerhalb der JVM gut optimiert. –

Verwandte Themen