Contain/Replace Methode verbessern?

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Contain/Replace Methode verbessern?

    Hallo,
    ich habe ein Modul, um ein Buch nach Wörtern zu sortieren. Die Sortierung soll Sonderzeichen und Umlaute wie normaleZeichen behandeln und Groß/Kleinschreibung ignorieren. Dazu dient hilft mir immoment dieser Code:

    VB.NET-Quellcode

    1. Private Function Checkumlaute(vergleichWort As String) As String
    2. vergleichWort = vergleichWort.ToLower
    3. If vergleichWort.Contains("ä") Then
    4. vergleichWort = vergleichWort.Replace("ä", "ae")
    5. End If
    6. If vergleichWort.Contains("ö") Then
    7. vergleichWort = vergleichWort.Replace("ö", "oe")
    8. End If
    9. If vergleichWort.Contains("ü") Then
    10. vergleichWort = vergleichWort.Replace("ü", "ue")
    11. End If
    12. If vergleichWort.Contains("ß") Then
    13. vergleichWort = vergleichWort.Replace("ß", "ss")
    14. End If
    15. If vergleichWort.Contains("é") Then
    16. vergleichWort = vergleichWort.Replace("é", "e")
    17. End If
    18. If vergleichWort.Contains("è") Then
    19. vergleichWort = vergleichWort.Replace("è", "e")
    20. End If
    21. If vergleichWort.Contains("í") Then
    22. vergleichWort = vergleichWort.Replace("í", "i")
    23. End If
    24. Return vergleichWort
    25. End Function


    Meine Frage ist, ob jemand einen Vorschlag zur Vereinfachung/Verbesserung hat - es kommen ggf. noch weitere Sonderzeichenzeichen hinzu, bei ca. 100.000 Wörtern pro Buch sind es recht viele Abfragen pro Wort.

    Ich habe es erst mit einer select Case Methode versucht, Problem waren jedoch mehrere vorkommen von verschiedenen Umlauten in einem Wort, z.B. "Ölüberschußländer" (Das steht zwar nicht im Buch, veranschaulicht aber das Problem)

    mfg J
    Versteh ich das richtig, du willst eine Liste aller Wörter (lies: Ergebnisse von .Split(" ")) erstellen und wissen, wie oft jedes Wort in dem String (Buch) vorkommt?
    Mach ein Dictionary(Of String, Integer), geh dann die Ergebnisse von .Split(" ") durch, füge dem Dictionary das Wort mit Integerwert 1 hinzu, falls es nicht existiert, und wenn es bereits im Dictionary ist, erhöhst du einfach den Integerwert.

    Samus Aran schrieb:

    Mach ein Dictionary(Of String, Integer), geh dann die Ergebnisse von .Split(" ") durch, füge dem Dictionary das Wort mit Integerwert 1 hinzu, falls es nicht existiert, und wenn es bereits im Dictionary ist, erhöhst du einfach den Integerwert.

    Ganz so einfach wäre es dann nicht, aber fast ... ;)

    for each wort in buch

    if not firstdic.contains(wort) then
    neuwort = konvertiere(wort)
    firstdic.add(wort, neuwort)
    else
    neuwort=firstdic(wort)
    endif

    if not seconddic.contains(neuwort) then
    secondic.add(neuwort,1)
    else
    seconddic(neuwort)+=1
    endif

    next wort

    Auf diese Weise spart man sich einiges an "Konvertierarbeit"
    Ich denke er will sie alphabetisch sortieren, warum sollte
    er sonst ä, ö und ü wie ae, oe und ue behandeln wollen?

    Grüße
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Wow, schonmal danke fürs schnelle Feedback.

    Übrigens, ja, es soll nach alphabet sortiert werden.
    der Text liegt "teilsortiert" schon im MS-DOS-Format (aus qbasic zeiten) vor,
    ich öffne die Datei mit nem streamreader und encoding

    VB.NET-Quellcode

    1. Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding(850)

    teilsortiert bedeutet, dass ein Wort und der Rest des zugehörigen Satzes schon vorhanden ist.
    Ich bin sozusagen am Beginn eines ReEngineerings.
    Das vorhandene Programm bietet eine Eingabe für ein Wort und blendet während der Worteingabe Mögliche Varianten vor (--> Autocomplete) sowie den Rest des Satzes, indem es steht.
    Zum Satz gehört jeweils noch eine Adresse, die noch im "alten"Programm (QBasic) verarbeitet wird- daher wird die sortierte Datei (erstmal) auch wieder so encodet(850) gespeichert.
    Daher ist der "umständliche" aber funktionierende Weg: Öfnnen mit enc -> sortieren -> speichern mit enc.

    den StringComparer kenne ich (noch) nicht, danke für den Hinweis - gleiches gilt für das Dictionary. War bislang nur "simple" Arrays gewöhnt und bin froh, dass objectorientierung so vieles vereinfacht.

    Wie das mit der Konvertierung gemeint ist, habe ich noch nicht ganz verstanden, mache mich aber schlau, bevor ich nur dumm drumherumfrage.

    Freue mich über weitere Vorschläge :) und melde mich, wenn ich weiter bin.

    mfg J
    Probier's einfach mal mit dem StringComparer, der ist gut für das geeignet, was du vorhast.
    Wenn du keinen eigenen Sortieralgorithmus einbauen willst, kannst du Array.Sort oder List<String>.Sort verwenden, um eine bestehende Wortliste zu sortieren. Da StringComparer das IComparer-Interface implementiert sieht der Aufruf aus wie folgt:

    VB.NET-Quellcode

    1. Dim woerter() As String = New String() {"Hallo", "Haus", "Hafen", "Welt", "Baum", "Fisch", "VB-Paradise", "Newbie", "ein", "Ein"}
    2. Array.Sort(woerter, StringComparer.CurrentCultureIgnoreCase)
    3. MessageBox.Show(String.Join(vbCrLf, woerter))

    Array.Sort basiert auf Quicksort.
    @Krschy: Ich hab' zwar auch nicht verstanden, was du vorhast, aber das klingt eher nicht brauchbar. Der StringComparer sortiert wirklich alphabetisch.

    Gruß
    ~blaze~