Umlaute gegen Pednants austauschen

  • VB.NET

Es gibt 31 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Umlaute gegen Pednants austauschen

    Tachchen :D,

    hab eine Frage. Und zwar ist in meinem Buch das ich gerade lese eine Aufgabe dessen Lösung für mich nicht ganz begreifbar ist :x
    Ich soll eine For Next-Schleife Forumulieren die in einem String alle Umlaute gg Pednants (ae, oe , ue) umwandelt.

    Hatte folgenden Ansatz gehabt vielleicht könnt ihr mir weiter helfen.

    VB.NET-Quellcode

    1. Dim x As String = TextBox1.Text
    2. For i As Integer = 0 To x.Length - 1
    3. Select Case x.Substring(i, 1)
    4. Case "ä"
    5. x.Remove(i)
    6. x.Insert(i, "ae")
    7. End Select
    8. Next
    9. Label1.Text = x


    Würd nur gerne wissen was daran falsch ist um den Rest kümmere ich mich dann.


    lg

    VB.NET-Quellcode

    1. Dim x As String = CStr(TextBox1.Text)
    2. For i As Integer = 0 To x.Length - 1
    3. Select Case x.Substring(i, 1)
    4. Case "ä"
    5. x.Replace("ä", "ae")
    6. End Select
    7. Next
    8. Label1.Text = x



    So erhalte ich den String genau so zurück wie er vorher war :s

    VB.NET-Quellcode

    1. UmlauteschwangerTB.Text = UmlauteschwangerTB.Text.Replace("ä", "ae").Replace("ö", "oe").Replace("ü", "ue")


    Ausnahmsweise C&P Code :rolleyes:
    „Was daraus gefolgert werden kann ist, dass jeder intelligentere User sein Geld lieber für Bier ausgibt, um einen schönen Rausch zu haben, und nicht dieses Ranzprodukt.“

    -Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Lukas“ ()

    Lukas schrieb:

    Ausnahmsweise C&P Code

    Wobei das zwar das "Problem" löst, aber leider an der Aufgabenstellung vorbei geht ;)

    StringAlt = "Blödmännchenödem"
    StringNeu = ""
    Für jeden buchstaben in StringAlt
    Wenn Buchstabe WasBesonderesIst() dann
    NeuerBuchstabe = ErsetzeDurchWasSinnvolles
    Sonst
    NeuerBuchstabe = Buchstabe
    Buchstabe an StringNeu anhängen
    Hat sich erledigt vielen Dank.



    VB.NET-Quellcode

    1. Dim x As String = TextBox1.Text
    2. For i As Short = 0 To CShort(x.Length - 1)
    3. Select Case x.Substring(i, 1)
    4. Case "ä"
    5. x = x.Replace("ä", "ae")
    6. Case "ö"
    7. x = x.Replace("ö", "oe")
    8. Case "ü"
    9. x = x.Replace("ü", "ue")
    10. End Select
    11. Next
    12. Label1.Text = x
    @pico: "Aufgabenstellung"... Warum kompliziert, wenn's auch einfach geht? Was hat denn die For-Schleife für einen Vorteil? Performanter? Ist .Replace jetzt auch auf die Liste verpönter Funktionen des VB-Paradise gekommen?

    For-Schleifen kannst du so ziemlich überall mal ausprobieren und anwenden.
    „Was daraus gefolgert werden kann ist, dass jeder intelligentere User sein Geld lieber für Bier ausgibt, um einen schönen Rausch zu haben, und nicht dieses Ranzprodukt.“

    -Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.

    Davinho schrieb:

    Hat sich erledigt

    Nicht wirklich ...

    Deine "Lösung" hat zwar eine Schleife, aber die Schleife braucht es nicht.
    .Replace(a,b) ersetzt ALLE Vorkommen von a durch b. Es reicht also die Lösung von Lukas. Aber das ist halt (auch) ohne Schleife.

    @Lukas:
    Warum kompliziert, wenn's auch einfach geht?

    Na weils eine ÜBUNGSAUFGABE ist. Und es darum geht, "Schleifen" (und was so dazu gehört) zu lernen und nicht, wie man ein Problem möglichst elegant löst. Wobei ich persönlich jetzt mal vermuten würde, dass die Ersetzungsschleife in diesem Fall tatsächlich Vorteile hätte.
    Naja, ich habe dann halt eine andere Auffassung davon. Es ist keine Arbeit in der Schule, und solange du das Ziel des Kapitels lernst...ist doch alles ok? Das ist meiner Meinung nach ein nicht so schöner Einsatz für eine Schleife, eben weil man es mit .Replace ebenfalls gut lösen ->kann(!). Muss nicht.

    Vermuten ist gut, aber warum findest du, dass die Schleife angebrachter ist? Ist Replace unperformant?

    Es gibt doch so viele (mMn) schönere Einsätze für For-Schleifen. Zum Beispiel Items durchgehen, oder Lists/Arrays durchsuchen, etc.
    „Was daraus gefolgert werden kann ist, dass jeder intelligentere User sein Geld lieber für Bier ausgibt, um einen schönen Rausch zu haben, und nicht dieses Ranzprodukt.“

    -Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.

    VB.NET-Quellcode

    1. deinStr = deinStr.Replace("ä","ae")
    2. deinStr = deinStr.Replace("ö","oe")
    3. deinStr = deinStr.Replace("ü","ue")


    oder:

    VB.NET-Quellcode

    1. deinStr = deinStr.Replace("ä","ae").Replace("ö","oe").Replace("ü","ue")


    Beides das gleiche.

    fertig.
    | Keine Fragen per PN oder Skype.

    Lukas schrieb:

    Ist Replace unperformant?
    Einer allein nicht, aber jeder für sich geht den kompletten String durch.
    Bei drei Replaces also drei Durchläufe.

    Auch wenn der Code im Framework wahrscheinlich gut optimiert ist, wird irgendwann vermutlich dennoch die Schleife schneller sein, weil da nur ein Schleifendurchlauf erforderlich ist (dafür aber drei Vergleiche).

    Vielleicht mag ja mal einer einen Performancetest machen :)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Lukas schrieb:

    Ist Replace unperformant?

    Vermutlich nicht, aber du wendest es dreimal an und jedesmal wird ein neuer String erzeugt (vermutlich), der gleich darauf wieder verworfen wird (bis auf das letzte Replace natürlich). Bei der Schleife erzeugst du nur genau EINEN neuen String. Außerdem braucht man Replace(String, String), während eigentlich Replace(Char, String) ausreichend wäre. Bei der Schleife kann mans aber machen.
    dulieberhimmel
    :D
    War ja nur die Antwort auf die Frage, ob Replace unperformant sei ;)



    Am Rande des Themas noch eine Anmerkung, weil mich kürzlich jemand danach fragte.

    Konstruieren wir mal den Fall, englische Zahlen in deutsche umzuwandeln.
    Ja, ich weiß, das macht man nicht mit Stringfunktionen, aber mir fällt gerade nichts Anschaulicheres ein.
    1,234,567.89 -> 1.234.567,89

    Da kann man die Replace-Methode nicht straigt-forward anwenden. Hier ist Mitdenken gefragt!
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Bei einem längeren String hätte das sicher seinen Vorteil. Ich hoffe mal, das unser TE keine Romane damit umtextet ;)

    Da kann man die Replace-Methode nicht straigt-forward anwenden. Hier ist Mitdenken gefragt!

    Im aktuellen Beispiel geht es ;) Du ersetzt ja später nichts, was du vorher nicht schonmal gemacht hast.
    „Was daraus gefolgert werden kann ist, dass jeder intelligentere User sein Geld lieber für Bier ausgibt, um einen schönen Rausch zu haben, und nicht dieses Ranzprodukt.“

    -Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.
    Wanna look?

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private r As New Random
    3. Private alphabet As String = String.Empty
    4. Private theString As String = String.Empty
    5. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    6. alphabet = "ABCDEFGHIJKLMOPQRSTUVWXYZÄÖÜ"
    7. alphabet &= alphabet.ToLower & "ß"
    8. Dim sb As New System.Text.StringBuilder
    9. For i = 1 To 1000
    10. sb.Append(alphabet(r.Next(0, alphabet.Length)))
    11. Next
    12. theString = sb.ToString
    13. End Sub
    14. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    15. Dim s As String
    16. ListBox1.Items.Add("Simple 20" & (From i In Enumerable.Range(1, 20) Select SimpleReplace()).Average.ToString)
    17. ListBox1.Items.Add("Complex 20" & (From i In Enumerable.Range(1, 20) Select ComplexReplace()).Average.ToString)
    18. End Sub
    19. Private Function SimpleReplace() As Long
    20. Dim stp As Stopwatch
    21. GC.Collect()
    22. GC.WaitForPendingFinalizers()
    23. GC.Collect()
    24. stp = Stopwatch.StartNew
    25. Dim out As String = theString.Replace("ä", "ae").Replace("ö", "oe").Replace("ü", "ue").Replace("ß", "ss").Replace("Ä", "Ae").Replace("Ö", "Oe").Replace("Ü", "Ue")
    26. stp.Stop()
    27. Return stp.ElapsedTicks
    28. End Function
    29. Private Function ComplexReplace() As Long
    30. Dim stp As Stopwatch
    31. GC.Collect()
    32. GC.WaitForPendingFinalizers()
    33. GC.Collect()
    34. stp = Stopwatch.StartNew
    35. Dim sb As New System.Text.StringBuilder
    36. For Each c In theString
    37. Select Case c
    38. Case "Ä"c : sb.Append("Ae")
    39. Case "Ö"c : sb.Append("Öe")
    40. Case "Ü"c : sb.Append("Ue")
    41. Case "ä"c : sb.Append("ae")
    42. Case "ö"c : sb.Append("oe")
    43. Case "ü"c : sb.Append("ue")
    44. Case Else : sb.Append(c)
    45. End Select
    46. Next
    47. stp.Stop()
    48. Return stp.ElapsedTicks
    49. End Function
    50. End Class

    Maybe I maked a Fehler, but it looks als wenn the schleifen-version mucho schneller ist ... (Faktor 10). Und vermutlich auch den GC weniger mit toten String-Referenzen nervt ...

    BTW ...
    Da kann man die Replace-Methode nicht straigt-forward anwenden.

    .Replace(",", "foo").Replace(".", ",").Replace("foo", ".")

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „picoflop“ ()

    Schönschön. Bei einem kurzen String macht das ganze jetzt noch keinen fühlbaren Unterschied. Also bei "ABCDEFGHIJKLMOPQRSTUVWXYZÄÖÜ". Bei längeren schon. Wie ich schon oben geschrieben habe.
    „Was daraus gefolgert werden kann ist, dass jeder intelligentere User sein Geld lieber für Bier ausgibt, um einen schönen Rausch zu haben, und nicht dieses Ranzprodukt.“

    -Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.
    Ich muss picoflop da Recht geben. Das könnt ihr doch so nicht bringen. Wie kann man auch nur mit Substring(i, 1) einen Char abfragen /facepalm