Wort/Arraysortierung (Umwandlung aus Zeichensortierung)

  • VB.NET

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

    Wort/Arraysortierung (Umwandlung aus Zeichensortierung)

    Hallo Leute

    Ich versuche eine funktionierende Zeichensortierung (Sortierung nach Alphabet) in eine Wortsortierung umzuwandeln, doch dies klappte bisher nicht.
    Der String "*braun*orange*gelb*violet*schwarz" möchte ich zu "*braun*gelb*orange*schwarz*violet" sortieren.

    Ich bin mir nicht sicher aber ich denke das Problem liegt am nach der inneren For-Schleife. Habe es schon beliebig verändert aber keine Lösung gefunden.
    Oder was könnte das Problem sein ?

    Danke für eure Hilfe

    Zeichensortierung: funktioniert

    VB.NET-Quellcode

    1. Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
    2. Dim a, b, min As Long
    3. Dim t As Char
    4. Dim strUnsort As String = "*braun*orange*gelb*violet*schwarz"
    5. For a = 1 To Len(strUnsort)
    6. min = a
    7. For b = a + 1 To Len(strUnsort)
    8. If Mid(strUnsort, b, 1) < Mid(strUnsort, min, 1) Then
    9. min = b
    10. End If
    11. Next
    12. t = Mid(strUnsort, a, 1)
    13. Mid(strUnsort, a, 1) = Mid(strUnsort, min, 1)
    14. Mid(strUnsort, min, 1) = t
    15. Next
    16. MsgBox(strUnsort)
    17. End Sub


    Ergebnis: *****aaabbceeegghillnnoorrrstuvwz

    Wortsortierung: Funktioniert nicht

    VB.NET-Quellcode

    1. Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click
    2. Dim a, b, min As Long
    3. Dim strUnsort As String = "*braun*orange*gelb*violet*schwarz"
    4. Dim wortarray() As String
    5. wortarray = Split(strUnsort, "*")
    6. Dim t As String
    7. For a = 1 To UBound(wortarray) - 1
    8. min = a
    9. For b = a + 1 To UBound(wortarray) - 1
    10. If wortarray(b) < wortarray(b + 1) Then
    11. min = b
    12. End If
    13. Next
    14. t = wortarray(a)
    15. wortarray(a) = wortarray(min)
    16. wortarray(min) = t
    17. Next
    18. strUnsort = Join(wortarray, "*")
    19. MsgBox(strUnsort)
    20. End Sub


    Ergebnis: *gelb*braun*orange*violet*schwarz
    @outlop Schau Dir mal dies an:

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    2. Dim a, b As Integer
    3. Dim strUnsort As String = "*braun*orange*gelb*violet*schwarz"
    4. Dim wortarray() As String
    5. wortarray = strUnsort.Split(New Char() {"*"c}, System.StringSplitOptions.RemoveEmptyEntries)
    6. For a = 0 To wortarray.Length - 1
    7. For b = a + 1 To wortarray.Length - 1
    8. If wortarray(a) > wortarray(b) Then ' < oder > für Sortierrichtung
    9. Dim t = wortarray(a)
    10. wortarray(a) = wortarray(b)
    11. wortarray(b) = t
    12. End If
    13. Next
    14. Next
    15. strUnsort = Join(wortarray, "*")
    16. MessageBox.Show(strUnsort)
    17. End Sub

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hey,

    hier bietet es sich an, die .OrderBy()-Extionsion zu verwenden.

    VB.NET-Quellcode

    1. Sub Main()
    2. Dim input As String = "*braun*orange*gelb*violet*schwarz"
    3. Dim words As String() = input.Split({"*"}, StringSplitOptions.RemoveEmptyEntries)
    4. words = words.OrderBy(Function(x) x).ToArray()
    5. End Sub
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    .. oder du lässt das Sortieren einfach von der List machen...

    VB.NET-Quellcode

    1. Private Sub Sortieren()
    2. Dim strUnsort As String = "*braun*orange*gelb*violet*schwarz"
    3. Dim SList As New List(Of String)
    4. SList.AddRange(strUnsort.Split("*"c))
    5. SList.Sort()
    6. ' SList.Reverse() ' falls Es andersherum sein soll
    7. ' wenn es ein String sein soll
    8. Dim Ergbnis As String = ""
    9. Ergbnis = Join(SList.ToArray, "*")
    10. MsgBox(Ergbnis)
    11. End Sub


    Edit :
    Zeile 10 geändert.. /verkürzt
    @SpaceyX , @RoulettePilot
    Manchmal muss man etwas auch zu Fuß machen, um es richtig zu verstehen, insbesondere unterschiedliche Sortieralgoritmmen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    ThePlexian schrieb:

    so kompliziert ?
    Füge den Code in ein Testprojekt von Dir ein und setze einen Haltepunkt drauf, falls Du es nicht so siehst. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke für eure Antworten und Lösungen kann ich gut für mein Sortierprojekt brauchen.

    RodFromGermany schrieb:

    @outlop Schau Dir mal dies an:

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    2. Dim a, b As Integer
    3. Dim strUnsort As String = "*braun*orange*gelb*violet*schwarz"
    4. Dim wortarray() As String
    5. wortarray = strUnsort.Split(New Char() {"*"c}, System.StringSplitOptions.RemoveEmptyEntries)
    6. For a = 0 To wortarray.Length - 1
    7. For b = a + 1 To wortarray.Length - 1
    8. If wortarray(a) > wortarray(b) Then ' < oder > für Sortierrichtung
    9. Dim t = wortarray(a)
    10. wortarray(a) = wortarray(b)
    11. wortarray(b) = t
    12. End If
    13. Next
    14. Next
    15. strUnsort = Join(wortarray, "*")
    16. MessageBox.Show(strUnsort)
    17. End Sub


    funktioniert gut

    -----------------------------------

    SpaceyX schrieb:

    Hey,

    hier bietet es sich an, die .OrderBy()-Extionsion zu verwenden.

    VB.NET-Quellcode

    1. Sub Main()
    2. Dim input As String = "*braun*orange*gelb*violet*schwarz"
    3. Dim words As String() = input.Split({"*"}, StringSplitOptions.RemoveEmptyEntries)
    4. words = words.OrderBy(Function(x) x).ToArray()
    5. End Sub


    funktioniert gut
    Nur noch dies anhängen.

    VB.NET-Quellcode

    1. Dim Ergbnis As String = Join(words.ToArray, "*")
    2. MsgBox(Ergbnis)


    -----------------------------------

    RoulettePilot schrieb:

    .. oder du lässt das Sortieren einfach von der List machen...

    VB.NET-Quellcode

    1. Private Sub Sortieren()
    2. Dim strUnsort As String = "*braun*orange*gelb*violet*schwarz"
    3. Dim SList As New List(Of String)
    4. SList.AddRange(strUnsort.Split("*"c))
    5. SList.Sort()
    6. ' SList.Reverse() ' falls Es andersherum sein soll
    7. ' wenn es ein String sein soll
    8. Dim Ergbnis As String = ""
    9. Ergbnis = Join(SList.ToArray, "*")
    10. MsgBox(Ergbnis)
    11. End Sub


    Edit :
    Zeile 10 geändert.. /verkürzt


    funktioniert gut
    verstehe dasc bei ("*"c)) in der Zeile 4 nicht ganz

    -----------------------------------

    RodFromGermany schrieb:

    @SpaceyX , @RoulettePilot
    Manchmal muss man etwas auch zu Fuß machen, um es richtig zu verstehen, insbesondere unterschiedliche Sortieralgoritmmen.


    ErfinderDesRades schrieb:

    aber .Net-Programmieren heißt genau, dass man sowas im Ernstfall nicht selber macht.


    Ja stimmt, die .NET Funktionen wären schon praktischer, aber da ich es auch verstehen möchte mache ich es(auch) manuell
    Im ernstfall würde ich die Version von ThePlexian oder RouettePilot verwenden

    -----------------------------------

    ErfinderDesRades schrieb:

    Ja, gute Fingerübung - deins ist BubbleSort, gell?

    Es ist ein Selectionsort

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „outlop“ ()

    outlop schrieb:

    verstehe das c bei ("*"c)) in der Zeile 4 nicht ganz
    Das c macht aus dem String ein Char.
    Option Strict On.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    outlop schrieb:

    Es ist ein Selectionsort
    nein, in post#2 hat Rod einen BubbleSort implementiert.
    Wie gesagt: Wesentlich praxisrelevanter wäre, wenn du die im Framework bereits gegebenen Sortier-Möglichkeiten für dich nutzbar machen lerntest, zumindest diese 3: Linq-Order By, Array.Sort, List(Of T).Sort) - kriegst du das inzwischen hin?

    outlop schrieb:

    verstehe dasc bei ("*"c)) in der Zeile 4 nicht ganz
    Das liest du am besten beim Erzeuger nach, im Kapitel "Literale": VB-Sprachreferenz auf MSDN (den link lohnt es, sich zu merken)

    ErfinderDesRades schrieb:

    nein, in post#2 hat Rod einen BubbleSort implementiert.


    ok. stimmt beim Selectionsort wird ja das kleinste Element gesucht und ganz nach links geschoben.

    ErfinderDesRades schrieb:

    Wie gesagt: Wesentlich praxisrelevanter wäre, wenn du die im Framework bereits gegebenen Sortier-Möglichkeiten für dich nutzbar machen lerntest, zumindest diese 3: Linq-Order By, Array.Sort, List(Of T).Sort) - kriegst du das inzwischen hin?

    Ja Einigermassen

    VB.NET-Quellcode

    1. Dim strSort As String = "haus apfel erdberre baum"
    2. Dim result As String
    3. Dim wortArray() As String = Split(Trim(strSort), " ")
    4. Dim SList As List(Of String) = New List(Of String)(wortArray)
    5. SList.Sort()
    6. wortArray = SList.ToArray()
    7. result = Join(wortArray, " ")
    8. MsgBox(result)


    VB.NET-Quellcode

    1. Dim strSort As String = "haus apfel erdberre baum"
    2. Dim result As String
    3. Dim wortArray() As String = Split(Trim(strSort), " ")
    4. Array.Sort(wortArray)
    5. result = Join(wortArray, " ")
    6. MsgBox(result)


    habe gerade eine Zeichensortieruung mit Array.Sort() erstellt.

    VB.NET-Quellcode

    1. Public Function arraySort(ByVal strSort As String) As String
    2. strSort = "haus apfel erdberre baum" 'beispiel
    3. Dim charArray As Char() = strSort.Take(Len(strSort)).ToArray()
    4. Array.Sort(charArray)
    5. Dim ergebnis As String = New String(charArray)
    6. Return ergebnis
    7. End Function

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „outlop“ ()

    Len, Trim und Split, die du verwendest, sind veraltetes Zeug aussm Microsoft.VisualBasic-Namespace. Ich empfehle sehr, böse Funktionen vermeiden, und die objektorientierten Methoden der String-Klasse für sich arbeiten zu lassen: String.Length, String.Trim und String.Split.
    Guck dir überhaupt mal die String-Klasse genau an - die bietet nämlich enorme Möglichkeiten. Nutze dazu den ObjectBrowser

    es könnte am Ende so aussehen:

    VB.NET-Quellcode

    1. Public Function arraySort() As String
    2. dim strSort = "haus apfel erdberre baum" 'beispiel
    3. Dim words = strSort.Split
    4. Array.Sort(words)
    5. Return String.Join(" ", words)
    6. End Function
    7. 'oder bisserl sophisticated
    8. Public Function LinqSort() As String
    9. Return String.Join(" ", From word In "haus apfel erdberre baum".Split Order By word)
    10. End Function

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ErfinderDesRades“ ()

    ErfinderDesRades schrieb:

    Len, Trim und Split, die du verwendest, sind veraltetes Zeug aussm Microsoft.VisualBasic-Namespace. Ich empfehle sehr, böse Funktionen vermeiden, und die objektorientierten Methoden der String-Klasse für sich arbeiten zu lassen: String.Length, String.Trim und String.Split.

    Danke für den Hinweis wusste ich nicht

    ----

    Habe inzwischen noch eine Lösung gefunden

    outlop schrieb:

    Hallo Leute

    Wortsortierung: Funktioniert nicht

    VB.NET-Quellcode

    1. Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click
    2. Dim a, b, min As Long
    3. Dim strUnsort As String = "*braun*orange*gelb*violet*schwarz"
    4. Dim wortarray() As String
    5. wortarray = Split(strUnsort, "*")
    6. Dim t As String
    7. For a = 1 To UBound(wortarray) - 1
    8. min = a
    9. For b = a + 1 To UBound(wortarray) - 1
    10. If wortarray(b) < wortarray(b + 1) Then
    11. min = b
    12. End If
    13. Next
    14. t = wortarray(a)
    15. wortarray(a) = wortarray(min)
    16. wortarray(min) = t
    17. Next
    18. strUnsort = Join(wortarray, "*")
    19. MsgBox(strUnsort)
    20. End Sub


    Ergebnis: *gelb*braun*orange*violet*schwarz



    Lösung:

    VB.NET-Quellcode

    1. Private Sub Button4_2_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click
    2. Dim a, b, min As Long
    3. Dim strUnsort As String = "*braun*orange*gelb*violet*schwarz"
    4. Dim wortarray() As String
    5. wortarray = Split(strUnsort, "*")
    6. Dim t As String
    7. For a = LBound(wortarray) To UBound(wortarray)
    8. min = a
    9. For b = a + 1 To UBound(wortarray)
    10. If wortarray(b) < wortarray(min) Then
    11. min = b
    12. End If
    13. Next
    14. t = wortarray(a)
    15. wortarray(a) = wortarray(min)
    16. wortarray(min) = t
    17. Next
    18. strUnsort = Join(wortarray, "*")
    19. MsgBox(strUnsort)
    20. End Sub


    Ergebnis: *braun*gelb*orange*schwarz*violet

    Das ist jetzt (wahrscheinlich) ein Selectionsort sein.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „outlop“ ()

    Du bedankst dich zwar für den Hinweis, aber du beherzigst ihn nicht.
    Du wurstelst ja fröhlich weiter mit dem ollen VB6-Zeugs.
    Kann ich nur von abraten. Irgendwann willst du vlt. mal vernünftigen Code schreiben, und dann stellst du doch um: böse Funktionen vermeiden
    Nur je später du das anfängst, desto mehr musst du korrigieren.

    Oder erkennst du nicht, dass böse Funktionen vermeiden ein Link ist, der auf weitergehende Info verweist, inklusive einer detaillierten Anleitung?

    Merke: Blaue Schrift, die auf MouseOver reagiert ist ein Link!

    ErfinderDesRades schrieb:

    Du bedankst dich zwar für den Hinweis, aber du beherzigst ihn nicht.
    Du wurstelst ja fröhlich weiter mit dem ollen VB6-Zeugs.
    Kann ich nur von abraten. Irgendwann willst du vlt. mal vernünftigen Code schreiben, und dann stellst du doch um: böse Funktionen vermeiden
    Nur je später du das anfängst, desto mehr musst du korrigieren.


    ja sry, blöde Angewohnheit, hab das vor kurzem so in der Berufsschule gelernt.

    Ohne böse Funktionen sollte es dann So Aussehen:

    VB.NET-Quellcode

    1. Dim a, b, min As Long
    2. Dim strUnsort As String = "*braun*orange*gelb*violet*schwarz"
    3. Dim wortarray() As String
    4. wortarray = strUnsort.Split("*")
    5. Dim t As String
    6. For a = wortarray.GetLowerBound(0) To wortarray.GetUpperBound(0) '(0) Dimension
    7. min = a
    8. For b = a + 1 To wortarray.GetUpperBound(0)
    9. If wortarray(b) < wortarray(min) Then
    10. min = b
    11. End If
    12. Next
    13. t = wortarray(a)
    14. wortarray(a) = wortarray(min)
    15. wortarray(min) = t
    16. Next
    17. strUnsort = String.Join("*", wortarray)
    18. MsgBox(strUnsort)


    ErfinderDesRades schrieb:

    Merke: Blaue Schrift, die auf MouseOver reagiert ist ein Link!

    schon klar, Danke trotzdem für die Erklärung ;)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „outlop“ ()