2014-05-06 8 views
15

In Scala, ich möchte eine Zeichenfolge an einer bestimmten Zeichens aufzutrennen wie so:Gibt es eine Kombination aus takeWhile, dropWhile in Scala?

scala> val s = "abba.aadd" 
s: String = abba.aadd 
scala> val (beforeDot,afterDot) = (s takeWhile (_!='.'), s dropWhile (_!='.')) 
beforeDot: String = abba 
afterDot: String = .aadd 

Diese Lösung ist leicht ineffizient (vielleicht nicht asymptotisch), aber ich habe das Gefühl, so etwas wie dies in der Standardbibliothek existieren könnte bereits. Irgendwelche Ideen?

+0

Sollte es keine 'Split'-Funktion geben? das wäre sauberer. Oder hält das '.' wichtig? –

Antwort

35

Es gibt eine span Methode:

scala> val (beforeDot, afterDot) = s.span{ _ != '.' } 
beforeDot: String = abba 
afterDot: String = .aadd 

Vom Scala documentation:

c span p ist äquivalent (aber möglicherweise effizienter als) (c takeWhile p, c dropWhile p), sofern die Auswertung des Prädikats p keine Nebenwirkungen verursacht.

+2

Nun, ich kann unmöglich etwas näher an meine Frage fragen :) – Felix

2

Sie können splitAt für das, was Sie wollen:

val s = "abba.aadd" 
val (before, after) = s.splitAt(s.indexOf('.')) 

Ausgang:

before: String = abba 
after: String = .aadd 
+0

Durchläuft die Sequenz zweimal, obwohl –

+0

nicht unbedingt. Hängt vom Scala Optimierer ab. –

+2

Ich denke, es lohnt sich zu erwähnen, dass der Zugriff auf Indizes von Sequenzen möglichst vermieden werden sollte, da der Direktzugriff für einmalige Fehler anfällig ist und sich nur selten zur Komposition innerhalb der funktionalen Programmierung eignet (dies basiert auf meiner Erfahrung) . Wo Random Access ins Spiel kommt, ist oft in Leistungsoptimierungen, wo Arrays oft die Zieldatenstruktur sind. – Felix

Verwandte Themen