2015-08-18 23 views
14

Qual è il modo più veloce per eliminare tutti gli spazi bianchi da una stringa arbitraria in Go.Elimina tutti gli spazi bianchi da una stringa

sto concatenamento due funzione dal set di corde:

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

Qualcuno ha un modo migliore per fare questo?

+0

@evanmcdonnal Perché si dedurre che? Sto chiedendo il modo migliore/più veloce per fare un'operazione generale. Non vedo il problema con la mia domanda. – Omn

+0

Se sto cercando di analizzare un dato input nel modo più efficiente possibile, di solito è utile sapere quale input è. Perché dovrei dedurlo? Perché hai omesso le informazioni pertinenti. – evanmcdonnal

+0

@evanmcdonnal Ok, bene ho chiarito che sto chiedendo di qualsiasi stringa arbitraria. – Omn

risposta

33

Ecco una soluzione che genera dati meno intermedi utilizzando strings.Map:

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

Questi sono i parametri di riferimento tra le due funzioni (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

Grazie, immagino che questo eviti di allocare quelle stringhe extra tra le chiamate Join e Field? – Omn

+0

@Omn: è corretto. –

1

Da rosettacode.org:

Puoi trovare questo tipo di Funzione:

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

Quindi, la semplice sostituzione chr da " " qui dovrebbe essere sufficiente per fare il trucco e rimuovere gli spazi bianchi.

Attenzione, ci sono altri tipi di spazi bianchi definiti da Unicode (come interruzione di riga, nbsp, ...), e potresti anche volerli eliminare (specialmente se lavori con dati esterni che non usi) t realmente avere il controllo su)

Questo dovrebbe essere fatto in questo modo:

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) 
} 

Poi semplicemente applicare alla stringa. Spero che funzioni, non abbia provato.

10

Ho trovato il modo più semplice sarebbe quella di utilizzare strings.Replace in questo modo:

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

>hellothisisatest 

Playground

+0

Questo non risponde correttamente alla domanda. Non stavo cercando il modo "più semplice" per rimuovere solo gli spazi. Stavo cercando il metodo generale più veloce per rimuovere TUTTI gli spazi bianchi. – Omn

+2

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

Problemi correlati