2015-11-10 3 views
0

Цель: вставить символ каждые х символов в строке в GolangКак вставить символ каждые X символов в строку в Голанге?

Вход:helloworldhelloworldhelloworld

Ожидаемый результат:hello-world-hello-world-hello-world

Попытки

Покушение один

package main 

import (
    "fmt" 
    "strings" 
) 

func main() { 
    s := "helloworldhelloworldhelloworld" 

    s = strings.Replace(s, "world", ",", -1) 
    fmt.Println(s) 
} 

Результаты в: hello,hello,hello,


Попытка два

  1. Граф количество символов
  2. Для цикла
  3. Если X = 5, то вставить -

Покушение три

  1. сканирования в сочетании с присоединиться

Проблема

Причина, по которой попытки два и три не содержат фрагменты кода в то момент - это Я все еще думаю, какой подход следует использовать для вставки символа в каждый символ X в строке в Голанге.

ответ

4

https://play.golang.org/p/HEGbe7radf

Эта функция просто вставляет '-' каждый элемент Nth

func insertNth(s string,n int) string { 
    var buffer bytes.Buffer 
    var n_1 = n - 1 
    var l_1 = len(s) - 1 
    for i,rune := range s { 
     buffer.WriteRune(rune) 
     if i % n == n_1 && i != l_1 { 
      buffer.WriteRune('-') 
     } 
    } 
    return buffer.String() 
} 
+0

https://play.golang.org/p/IzcWx771wF Вот несколько более общий вариант, который принимает произвольный рун для использования в качестве символа для вставки. –

1

Согласно документации Go strings are a read only Slice of bytes.. Имея это в виду, возникает проблема. Какой набор символов вы используете? Вы можете увидеть некоторые примеры того, где вещи становятся странными here и here.

Несмотря на всю сложность там еще есть простой ответ

s = strings.Replace(s, "hello", "hello-", -1) 
s = strings.Replace(s, "world", "world-", -1) 
1

Мое мнение:


import (
    "fmt" 
    "regexp" 
) 

const s = "helloworldhelloworldhelloworld" 

func Attempt1(s string) string { 
    var re = regexp.MustCompile(`(\Bhello|\Bworld)`) 
    return re.ReplaceAllString(s, "-$1") 
} 

func Attempt2(s string) string { 
    const chunkLen = len("hello") 
    out := make([]rune, len(s)+len(s)/chunkLen) 
    i, j := 1, 0 
    for _, c := range s { 
     out[j] = c 
     if i == len(s) { 
      break 
     } 
     j++ 
     if i%chunkLen == 0 { 
      out[j] = '-' 
      j++ 
     } 
     i++ 
    } 
    return string(out) 
} 

func main() { 
    fmt.Println(Attempt1(s)) 
    fmt.Println(Attempt2(s)) 
} 

Playground link

Я хотел бы добавить, что в то время как можно было бы реализовать «подход 3 "—, что" разделить исходную строку в куски пять символов, затем присоединиться к куски, использующие символ «-», один, — , все равно потребуется выполнить сканирование исходной строки rune-by-rune, как это делает мой Attempt2(); поэтому, если вы прищурились, вы увидите, что сохранение списка кусков, а затем их объединение делает больше операций для реального эффекта (и большего объема памяти и т. д.).

0

Я чувствую следующее решение стоит отметить:

package main 

import "fmt" 

var s = "helloworldhelloworldhelloworld" 

func main() { 
    for i := 5; i < len(s); i += 6 { 
     s = s[:i] + "-" + s[i:] 
    } 
    fmt.Println(s) 
} 

https://play.golang.org/p/aMXOTgiNHf

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