Aus list of char alle kombinationen ausgeben

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von hans im glück.

    Aus list of char alle kombinationen ausgeben

    Hi Leute,

    nach langer Abstinenz grüble ich an einer Aufgabe wo ich keinen mm weiter komme.

    Einfacher Usecase: Aus einer Textbox wandern Wörter / Strings in eine kleine Tabelle im Dataset.

    Eine SChleife sammelt jeweils die Anfangsbuchstaben der Wörter in einer list of Char ein.

    Im nächsten Step möchte ich gerne alle möglichen Char-Kombinationen ausgeben, wiederrum z.B. in einer List of String.
    Daran scheitere ich.
    Ziel soll sein alle erdenklichen "Kunstwörter" aus den Anfangsbuchstaben der in der Tabelle enthaltenen Wörter zu generieren.

    VB.NET-Quellcode

    1. Dim list As New List(Of Char)
    2. Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click
    3. Dts.Words.AddWordsRow(tbAddText.Text)
    4. End Sub
    5. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    6. End Sub
    7. Private Sub btnGenName_Click(sender As Object, e As EventArgs) Handles btnGenName.Click
    8. list.Clear()
    9. For Each Name As dts.WordsRow In Dts.Words.Rows
    10. list.Add(Name.Word.Substring(0, 1))
    11. Next
    12. genName()
    13. End Sub
    14. Sub genName()
    15. Dim name As String
    16. For Each c As Char In list
    17. name = name & c
    18. Next
    19. MessageBox.Show(name)
    20. End Sub
    21. Sub sort()
    22. 'Hier sollen alle möglichen char Kombinationen in der Liste erzeugt werden.
    23. End Sub
    Gruß Hannes
    Jo, das nennt man "Permutieren", und ist nicht trivial.
    Ich hab einen "einfachen" Artikel auf deutsch dazu verzapft, mit vergleichsweise schlechtem Code, und einen ich finde fabelhaften auf Englisch, und auch mit ausgezeichnetem Code (nur will ihn keiner auszeichnen :( )
    Permutationen
    codeproject.com/Articles/1111639/Permutations
    Du kannst dich auch selbst auf Wiki umtun, wasses da über "Kombinatorik" zu lernen gibt.

    edit: ich glaub ich muss den deutschen echt überarbeiten - die Begriffe sind nicht richtig. Was ich da "combinatoric" nenne ist was du suchst, muss aber "Permutation in spezieller mathematischer Bedeutung" heissen, um es vom allgemeinen Begriff "Permutation" abzugrenzen.
    also lies den englischen - der behandelt das alles viel besser.

    ErfinderDesRades schrieb:

    Jo, das nennt man "Permutieren", und ist nicht trivial.


    Meinst du das Permutieren an sich verstehen, oder einen Algorithmus umzusetzen? Weil Permutation an sich schon trivial ist meiner Meinung nach.

    Dassis echt blöd mit den Begrifflichkeiten.
    allgemein bedeutet Permutieren - mathematisch ausgedrückt: "Nimm k Elemente von n Optionen".
    Und da gibts inne Mathematik 2 Regeln zu, nämlich
    1) ob man dasselbe Element mehrmals nehmen darf (oder nicht), und
    2) ob dieselben Elemente - jedoch in anderer Reihenfolge - ob das als 2 verschiedene Permutationen gilt (respect Order) oder als dieselbe.
    Aber man kann sich noch beliebige weitere Regeln ausdenken, und kommen immer verschiedene Permutations-Ergebnisse bei raus (das ist in meim deutschen Artikel gezeigt).

    Nochmal Begriffe: Dollerweise heisst das einzelne Ergebnis - also wenn man die k Elemente genommen hat - das heisst auch "Permutation" - ebenso wie der Gesamt-Vorgang, wenn man die n Optionen permutiert.
    Ja, und dann gibts noch eine ganz spezielle Permutation, die heisst (leider) auch "Permutation", nämlich wenn man von n Optionen immer alle nimmt. Und die "nur" immer anders anordnet. Hierbei ist zulässig, dass in den Optionen Dubletten vorkommen - ein Problem, was als erstes ein gewisser Herr Dijkstra algorithmisch gelöst hat (den Namen darf man sich merken, der hat noch andere Sachen gelöst).
    (Dieser Spezialfall ist eminent wichtig - etwa wenn du Scrabble spielst, bist du quasi ununterbrochen damit beschäftigt, ein maximales gültiges n zu finden (naja, so ähnlich).)

    Soweit die abstrakte Theorie - noch ohne auch nur ein Fizzelchen Implementierung.
    Ok - du sagst das sei trivial - "trivial" ist ja relativ und hängt ganz vonne persönlichen Skills ab - also für mich ist das bisserl was anneres als "trivial" - vor allem, wenns dann an die codetechnische Umsetzung geht... ;)

    Wie dem auch sei - @hans im glück ist offensichtlich mit einer Art "Scrabble" beschäftigt, und da verweise ich auf Dijkstra - bzw meine Implementation davon.

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

    der stoff ist zu hoch für mich.

    ich helfe mir vorerst hiermit (und mit dem wissen, dass ich die anzahl der ergebnisse an vorschlägen ohnehin nicht einsehen könnte da zu viele :) )

    VB.NET-Quellcode

    1. Function rndSort(ByRef liste As List(Of Char)) As String
    2. Dim name As String
    3. Dim listTarget As New List(Of Char)(liste.Count)
    4. Dim randomize As New System.Random()
    5. While (liste.Count > 0)
    6. Dim index As Integer = randomize.Next(liste.Count)
    7. listTarget.Add(liste(index))
    8. liste.RemoveAt(index)
    9. End While
    10. For Each c As Char In listTarget
    11. name = name & c
    12. Next
    13. Return name
    14. End Function
    Gruß Hannes