Usar strings.Replace() para reemplazar todos los valores de un diccionario en una cadena

publicado por: Anonymous

He usado un par de veces esta función y ahora tengo un ejercicio el cual no puedo aun hacer funcionar. Tengo una cadena (cadena) y un diccionario (griegoDicc), necesito reemplazar cada caracter griego por el valor numérico.
Pero “resultado” es igual a “cadena”, no realiza el reemplazo. ¿Alguno sabrá por qué sucede esto?

package main

import (
    "log"
    "strings"
)

func main() {
    cadena := "ΨφΔξβΨμλΓΛ ΡΘξΡΛξΠμφ λΨξΘΓΠμΓΔ ΨξΛφζΡμλΓ ΔξΛφζΡμλΓ ΔξΛφζΡμλΓ ΔξΨφΔξΡΛξ μηφΔΨξΔΡξ μΨλΓΘξαΓΔ ΡΩΓΘξΣΡΔξ ΡΩξλμΨΩΨξ ΓξΛΓξΩΨζΛ ΡξφΠηΓΛΔΓ ΔξΦΓξΘηξλ μΨΩΨξΔφΠΩ φΘφβΨξΓζμ φΡμΨΩξΛΓΘ ξΞμΨΣφΩαφ ΓΘξηΩφΔΓΘ ξΔΡΛξΘηΔξ ΦξΛΨΘξΛφζ μΡΘξΔΡΛξβ ηΩΔΨξμΡΘΞ ΨΩΔΡΩξΓΛξ ΠμΓΩξΞηΡζ ΛΨξΓμΠΡΩλ φΩΨξΘΓΛηΔ ξΓΛξΠμΓΩξ ΞηΡζΛΨξΓμ ΠΡΩλφΩΨξΘ ΓΛηΔξΦξΛΨ ΘξΛφζμΡΘξ ΔΡΛξβηΩΔΨ ξμΡΘΞΨΩΔΡ ΩξΓΛξΠμΓΩ ξΞηΡζΛΨξΓ μΠΡΩλφΩΨξ ΘΓΛηΔξΦξΛ ΨΘξΛφζμΡΘ ξΔΡΛξβηΩΔ ΨξμΡΘΞΨΩΔ ΡΩξΓΛξΠμΓ ΩξΞηΡζΛΨξ ΓμΠΡΩλφΩΨ ξΘΓΛηΔξαΨ μΨξΘΡΓΩξΡ λΡμΩΨΘξΛΨ ΘξΛΓημΡΛΡ ΘξϑηΡξΘηΞ φβΨΘξαΨΩΘ ΡΠηφμξϑηΡ ξΘηΞφβΨΘξ αΨΩΘΡΠηφμ ξαΨμΨΩΓΔΨ ΘξΔΡξΠΛΨμ φΓξΣφΣΓβΨ ΘξΨξεημΡβ ΨΘξαΨΩξΠΛ ΨμφΓξβΨμφ μξΨξεημΡβ ΨΘξαΨΩξΠΛ ΨμφΓξβΨμφ μξΨξεημΡβ ΨΘξαΨΩξΠΛ ΨμφΓξβΨμφ μ"
    // caracteres := "ΨφΔξβμλΓΛΡΘΠζηαΩΣΦΞϑε "
    var resultado string
    griegoDicc := [][]string{{"Ψ", "700"}, {"φ", "500"}, {"Δ", "4"}, {"ξ", "60"}, {"β", "2"}, {"μ", "40"}, {"λ", "30"}, {"Γ", "3"}, {"Λ", "30"}, {"Ρ", "100"}, {"Θ", "9"}, {"Π", "80"}, {"ζ", "7"}, {"η", "8"}, {"α", "1"}, {"Ω", "800"}, {"Σ", "200"}, {"Φ", "500"}, {"Ξ", "60"}, {"ϑ", "9"}, {"ε", "5"}}

    for _, equivalencia := range griegoDicc {

        resultado = strings.Replace(cadena, equivalencia[0], equivalencia[1], -1)

    }
    log.Print(resultado)

}

solución

En la primera iteración, resultado tendrá el reemplazo de "Ψ" por "700" en cadena:

resultado = strings.Replace(cadena, "Ψ", "700", -1)

En la segunda iteración, resultado tendrá el reemplazo de "φ" por "500" en cadena:

resultado = strings.Replace(cadena, "φ", "500", -1)

¡¿En cadena?!
Ahí está el problema. Siempre estás reemplazando en el string original. En cambio, si le asignaras todo a resultado al inicio, y reemplazaras siempre en resultado funcionaría:

cadena := "ΨφΔξβΨμλΓΛ ΡΘξΡΛξΠμφ λΨξΘΓΠμΓΔ ΨξΛφζΡμλΓ ΔξΛφζΡμλΓ ΔξΛφζΡμλΓ ΔξΨφΔξΡΛξ μηφΔΨξΔΡξ μΨλΓΘξαΓΔ ΡΩΓΘξΣΡΔξ ΡΩξλμΨΩΨξ ΓξΛΓξΩΨζΛ ΡξφΠηΓΛΔΓ ΔξΦΓξΘηξλ μΨΩΨξΔφΠΩ φΘφβΨξΓζμ φΡμΨΩξΛΓΘ ξΞμΨΣφΩαφ ΓΘξηΩφΔΓΘ ξΔΡΛξΘηΔξ ΦξΛΨΘξΛφζ μΡΘξΔΡΛξβ ηΩΔΨξμΡΘΞ ΨΩΔΡΩξΓΛξ ΠμΓΩξΞηΡζ ΛΨξΓμΠΡΩλ φΩΨξΘΓΛηΔ ξΓΛξΠμΓΩξ ΞηΡζΛΨξΓμ ΠΡΩλφΩΨξΘ ΓΛηΔξΦξΛΨ ΘξΛφζμΡΘξ ΔΡΛξβηΩΔΨ ξμΡΘΞΨΩΔΡ ΩξΓΛξΠμΓΩ ξΞηΡζΛΨξΓ μΠΡΩλφΩΨξ ΘΓΛηΔξΦξΛ ΨΘξΛφζμΡΘ ξΔΡΛξβηΩΔ ΨξμΡΘΞΨΩΔ ΡΩξΓΛξΠμΓ ΩξΞηΡζΛΨξ ΓμΠΡΩλφΩΨ ξΘΓΛηΔξαΨ μΨξΘΡΓΩξΡ λΡμΩΨΘξΛΨ ΘξΛΓημΡΛΡ ΘξϑηΡξΘηΞ φβΨΘξαΨΩΘ ΡΠηφμξϑηΡ ξΘηΞφβΨΘξ αΨΩΘΡΠηφμ ξαΨμΨΩΓΔΨ ΘξΔΡξΠΛΨμ φΓξΣφΣΓβΨ ΘξΨξεημΡβ ΨΘξαΨΩξΠΛ ΨμφΓξβΨμφ μξΨξεημΡβ ΨΘξαΨΩξΠΛ ΨμφΓξβΨμφ μξΨξεημΡβ ΨΘξαΨΩξΠΛ ΨμφΓξβΨμφ μ"

var resultado string
griegoDicc := [][]string{{"Ψ", "700"}, {"φ", "500"}, {"Δ", "4"}, {"ξ", "60"}, {"β", "2"}, {"μ", "40"}, {"λ", "30"}, {"Γ", "3"}, {"Λ", "30"}, {"Ρ", "100"}, {"Θ", "9"}, {"Π", "80"}, {"ζ", "7"}, {"η", "8"}, {"α", "1"}, {"Ω", "800"}, {"Σ", "200"}, {"Φ", "500"}, {"Ξ", "60"}, {"ϑ", "9"}, {"ε", "5"}}

//ACÁ asignamos el valor original a resultado
resultado = cadena
for _, equivalencia := range griegoDicc {
    //y acá reemplazamos sobre el valor de resultado
    resultado = strings.Replace(resultado, equivalencia[0], equivalencia[1], -1)
}
log.Print(resultado)

https://play.golang.org/p/-TLo-Qga0Di

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *