2015-08-18 4 views
14

Jaki jest najszybszy sposób na usunięcie wszystkich białych znaków z dowolnego ciągu znaków w polu Przejdź.Usunięcie wszystkich spacji z ciągu znaków

jestem łączenia dwóch funkcji z pakietu strun:

response = strings.Join(strings.Fields(response),"") 

Ktoś ma lepszy sposób to zrobić?

+0

@evanmcdonnal Dlaczego wywnioskować, że? Pytam o najlepszy/najszybszy sposób wykonania operacji ogólnej. Nie widzę problemu z moim pytaniem. – Omn

+0

Jeśli próbuję analizować dane wejściowe tak wydajnie, jak to możliwe, zazwyczaj pomaga to wiedzieć, co to jest wejście. Dlaczego miałbym to wywnioskować? Ponieważ pominąłeś odpowiednie informacje. – evanmcdonnal

+0

@evanmcdonnal Ok, cóż, wyjaśniłem, że pytam o dowolny ciąg znaków. – Omn

Odpowiedz

33

tutaj rozwiązanie, które powoduje mniej danych pośrednich, za pomocą strings.Map:

strings.Map(func(r rune) rune { 
    if unicode.IsSpace(r) { 
    return -1 
    } 
    return r 
}, response) 

Poniżej punktów odniesienia między obie te funkcje (source data)

 
BenchmarkSpaceMap  500  2941575 ns/op  221184 B/op   2 allocs/op 
BenchmarkSpaceFieldsJoin   300  4967475 ns/op  524288 B/op   3 allocs/op 
package main_test 

import (
    "strings" 
    "unicode" 
    "testing" 
) 

func SpaceMap(str string) string { 
    return strings.Map(func(r rune) rune { 
     if unicode.IsSpace(r) { 
      return -1 
     } 
     return r 
    }, str) 
} 

func SpaceFieldsJoin(str string) string { 
    return strings.Join(strings.Fields(str), "") 
} 

func BenchmarkSpaceMap(b *testing.B) { 
    for n := 0; n < b.N; n++ { 
     SpaceMap(data) 
    } 
} 

func BenchmarkSpaceFieldsJoin(b *testing.B) { 
    for n := 0; n < b.N; n++ { 
     SpaceFieldsJoin(data) 
    } 
} 
+0

Dzięki, zgaduję, że unika to przydzielania dodatkowych ciągów między połączeniami i połączeniami Field? – Omn

+0

@Omn: Zgadza się. –

1

Z rosettacode.org:

Możesz znaleźć ten rodzaj Funkcja:

func stripChars(str, chr string) string { 
    return strings.Map(func(r rune) rune { 
     if strings.IndexRune(chr, r) < 0 { 
      return r 
     } 
     return -1 
    }, str) 
} 

Więc, po prostu zastępując chr przez " " tutaj powinno wystarczyć, aby załatwić sprawę i usuń spacje.

Pamiętaj, że istnieją inne białe znaki zdefiniowane przez unicode (np. Podział wiersza, nbsp, ...), a możesz również chcieć się ich pozbyć (szczególnie jeśli pracujesz z zewnętrznymi danymi, których nie znasz). t naprawdę mieć kontrolę nad)

Robi się to w ten sposób:

func stripSpaces(str string) string { 
    return strings.Map(func(r rune) rune { 
     if unicode.IsSpace(r) { 
      // if the character is a space, drop it 
      return -1 
     } 
     // else keep it in the string 
     return r 
    }, str) 
} 

Następnie wystarczy zastosować do łańcucha. Mam nadzieję, że to działa, nie testowałem.

10

znalazłem najprostszym sposobem byłoby wykorzystanie strings.Replace tak:

randomString := " hello  this is a test" 
fmt.Println(strings.Replace(randomString, " ", "", -1)) 

>hellothisisatest 

Playground

+0

To nie odpowiada poprawnie na pytanie. Nie szukałem "najprostszego" sposobu usuwania tylko spacji. Szukałem najszybszej ogólnej metody usuwania WSZYSTKICH białych znaków. – Omn

+2

stringvar = string.Replace (randomString, "", "", -1) – jshapy8