2013-01-24 25 views
11

Czy jest to dopuszczalne podejście do usuwania wielu typów znaków z ciągu znaków lub czy istnieje lepszy (bardziej efektywny sposób)? Fragment "ilr".contains(_) brzmi trochę jak oszustwo, biorąc pod uwagę, że będzie to robione dla każdej postaci, ale znowu, być może jest to właściwa droga. Czy istnieje szybszy lub bardziej wydajny sposób na zrobienie tego?Usuwanie wielu typów znaków z ciągu znaków

val sentence = "Twinkle twinkle little star, oh I wander what you are" 

val words = sentence.filter(!"ilr".contains(_)) 

// Result: "Twnke twnke tte sta, oh I wande what you ae" 

Odpowiedz

25

Nie ma znaczącej różnicy, ponieważ do usunięcia są tylko 3 znaki i nie ma tak dużego ciągu do filtrowania, ale można rozważyć użycie zestawu w tym celu. Na przykład.

val toRemove = "ilr".toSet 
val words = sentence.filterNot(toRemove) 
25

bym po prostu użyć Java jest dobry stary replaceAll (trwa regexp):

"Twinkle twinkle little star, oh I wander what you are" replaceAll ("[ilr]", "") 
// res0: String = Twnke twnke tte sta, oh I wande what you ae 

W przeciwieństwie do pracy z char s (jak w filtrowania Seq[Char]), używając wyrażeń regularnych powinny być Unicode-safe, nawet jeśli pracujesz z punktami kodu poza podstawową płaszczyzną wielojęzyczną. "There Ain't No Such Thing As Plain Text."

+1

+1 Dzięki, ciągle zapominam, jak blisko jest Java. – Jack

+0

Możesz mieć punkt na "poza BMP". Ale jeśli ci na tym zależy, lepiej zajmij się testowaniem - nie ma * prawie * nie ma czegoś takiego jak bezpieczne oprogramowanie BMP (http://stackoverflow.com/a/2533118/53974). Na szczęście SDK jest najwyraźniej wyjątkiem, jeśli korzystasz z właściwych interfejsów API - a regexps są wśród błogosławionych. http://www.oracle.com/us/technologies/java/supplementary-142654.html – Blaisorblade

Powiązane problemy