2015-08-18 3 views
14

Каков самый быстрый способ удалить все пробелы из какой-либо произвольной строки в Go.Зачистить все пробелы из строки

Я цепочка две функции из пакета строки:

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

Кто-нибудь есть лучший способ сделать это?

+0

@evanmcdonnal Почему бы вы сделать вывод, что? Я спрашиваю о наилучшем/наиболее быстром способе выполнения общей операции. Я не вижу проблемы с моим вопросом. – Omn

+0

Если я пытаюсь разобрать данный ввод как можно более эффективно, он обычно помогает узнать, что это за вход. Почему я должен это сделать? Потому что вы опустили соответствующую информацию. – evanmcdonnal

+0

@evanmcdonnal Хорошо, я разъяснил, что я спрашиваю о любой произвольной строке. – Omn

ответ

33

Вот решение, которое генерирует меньше промежуточных данных с помощью strings.Map:

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

Ниже приведены критерии между обеими функциями (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

Спасибо, я предполагаю, что это позволяет избежать выделения дополнительных строк между вызовами Join и Field? – Omn

+0

@Omn: Это правильно. –

1

От rosettacode.org:

Вы можете найти этот вид Функция:

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

Итак, просто заменив chr на " " здесь должно быть достаточно, чтобы сделать трюк и удалить пробельные.

Остерегайтесь того, что существуют другие типы пробелов, определенные в unicode (например, разрыв строки, nbsp, ...), и вы также можете избавиться от них (особенно если вы работаете с внешними данными, т действительно есть контроль над)

Это будет сделано таким образом:

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

Затем просто применить к строке. Надеюсь, он работает, не тестировал.

10

Я нашел самый простой способ будет использовать strings.Replace так:

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

>hellothisisatest 

Playground

+0

Это не отвечает на вопрос правильно. Я не искал «самый простой» способ удаления пробелов. Я искал самый быстрый общий метод для удаления ВСЕХ пробелов. – Omn

+2

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

Смежные вопросы