Bedingte Sortierung eines multidimensionalen Arrays (Katalog)

  • Allgemein

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

    Bedingte Sortierung eines multidimensionalen Arrays (Katalog)

    Hallo und schönen Sonntag Morgen.

    Ich habe ein Problem mit dem
    ich mich nun schon eine Weile auseinandersetze - etwas passendes konnte
    ich im Forum leider nicht finden.
    Ich habe ein großes Array mit den Dimensionen Catalog (0-72074, 0-6)
    Dieses Array ist eine Art Katalog, d.h. des sieht ca folgendermaßen aus:

    Thema, Unterthema, weiteres Unterthema1, weiteres Unterthema2, weiteres Unterthema3...
    also:

    1111, 1111, 1111, 1111, 1111, 1111
    1111, 1111, 1111, 1111, 1111, 1112
    1111, 1111, 1111, 1111, 1111, 1114
    1111, 1112, 1112, 1113, 1112, 1113
    1111, 1112, 1112, 1113, 1112, 1115
    1111, 1112, 1112, 1113, 1112, 1116
    1112, 1112, 1112, 1113, 1112, 1116

    Das Problem: Der Katalog ist unsortiert.

    Die Lösung sieht vermutlich so aus:
    1. Sortiere Thema
    2. innerhalb jedes Themas sortiere Unterthema
    3. innerhalb jedes Unterthemas sortiere Weiteres Unterthema1
    4. innerhalb jedes Unterthemas sortiere Weiteres Unterthema2
    5. innerhalb jedes Unterthemas sortiere Weiteres Unterthema3

    Versucht habe ich bisher das Array in Objekte zu konvertieren und dann zu sortieren (Beschrieben in VB 2005 Entwicklerbuch
    , Seite 123). Das hat auch geklappt doch leider kann ich mit der Lösung
    nicht innerhalb eines Themas bzw. Unterthemas sortieren (zumindest weiß
    ich nicht wie). Außerdem habe ich mir einen Bubble Sort algorithmus
    gebastelt - hier ist allerdings die schwierigkeit dass er Zeilen
    verschieben soll und nicht einzelne Werte - es brachte auch nicht das
    gewünschte Ergebnis.

    Hat jemand eine Idee wie man einen
    "geschachtelten Sortieralgorithmus" wie oben beschrieben umsetzt? Oder
    eine bessere alternative?
    Vielen Dank und mit freundlichen Grüßen,
    Fischkopp

    Edit: Ich habe dieses Thema eben versehentlich im Grundlagen-Bereich gepostet. :rolleyes:
    Das sieht für mich nach einem möglichen Anwendungsfall für Verschachtelungen aus. Du müsstest dir dann halt für jede Stufe eine Klasse erstellen, welche dann wieder von der nächstunteren Stufe eine Liste parat hat. Wenn du möchtest, mach ich dir auch ein Beispiel dazu :).
    @Fischkopp_Hamburg:: Habe ich Dich richtig verstanden:
    Du nöchtest zuerst nach der 1. Spalte sortieren, danach nach der 2. Spalte und danach nach der 3. usw?
    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!
    Hatte grad Lust, ein Beispiel dafür zu machen, also bekommst du eins ;).
    Schau dir mal dieses Beispiel an, das könntest du auch auf dein System übertragen:

    VB.NET-Quellcode

    1. Public Class Land
    2. Public Property Name As String
    3. Public Property BundesLänder As List(Of BundesLand)
    4. Public Sub Sort()
    5. 'Die Bundesländer sortieren
    6. Me.BundesLänder = Me.BundesLänder.OrderBy(Function(bl) bl.Name).ToList()
    7. 'Die Landkreise in den Bundesländern sortieren lassen
    8. Me.BundesLänder.ForEach(Sub(bl) bl.Sort())
    9. End Sub
    10. End Class
    11. Public Class BundesLand
    12. Public Property Name As String
    13. Public Property LandKreise As List(Of LandKreis)
    14. Public Sub Sort()
    15. 'Die Landkreise sortieren
    16. Me.LandKreise = Me.LandKreise.OrderBy(Function(lk) lk.Name).ToList()
    17. 'Die Städte in den Landkreisen sortieren lassen
    18. Me.LandKreise.ForEach(Sub(lk) lk.Sort())
    19. End Sub
    20. End Class
    21. Public Class LandKreis
    22. Public Property Name As String
    23. Public Property Städte As List(Of Stadt)
    24. Public Sub Sort()
    25. 'Die Städte sortieren
    26. Me.Städte = Me.Städte.OrderBy(Function(s) s.Name).ToList()
    27. End Sub
    28. End Class
    29. Public Class Stadt
    30. Public Property Name As String
    31. End Class

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

    Vielen Dank schonmal für Eure Antworten.

    @ nafets3646
    Das sieht für mich nach einem möglichen Anwendungsfall für
    Verschachtelungen aus. Du müsstest dir dann halt für jede Stufe eine
    Klasse erstellen, welche dann wieder von der nächstunteren Stufe eine
    Liste parat hat. Wenn du möchtest, mach ich dir auch ein Beispiel dazu :).
    Ja, das hört sich nach dem an was ich benötige. Sehe ich das richtig dass ich dann von meiner bereits existierenden Klasse "Katalog" welche die Parameter "Thema", "Unterthema", usw. hat überladene Instanzen bauen muss? Ein Beispiel wäre sehr nett und hilfreich :thumbsup:
    Edit: ich habe gerade gesehen dass du code gepostet hast, ich schaue da mal rein -> Vielen Dank!!


    @ RodFromGermany
    Du nöchtest zuerst nach der 1. Spalte sortieren, danach nach der 2. Spalte und danach nach der 3. usw?
    Ja, das ist korrekt. Jedoch soll bei der Sortierung jeweils erhalten bleiben -> Wenn die erste Spalte sortiert ist, habe ich ca 14 Themen (also sehr viele doppelte Einträge). Dann möchte ich innerhalb des ersten Themas alle Unterthemen sortieren (Spalte 2). Dann möchte ich innerhalb der Unterthemen das weitere unterthema 1 sortieren (spalte 3) usw.
    Das Problem ist, dass wenn ich einfach nach Spalte 1, Spalte 2, Spalte 3 usw. sortiere, meine erste sortierung verloren geht. Soll heißen, wenn ich bei Spalte 5 angekommen bin, ist meine Sortierung von Spalte 1, 2, 3 wieder vollkommen durcheinander.
    @Fischkopp_Hamburg:: Dann sortiere alles zunächst nach Spalte 1.
    Dann sortiere alle Werte, deren Spalte 1-Wert gleich ist, nach der 2. Spalte,
    Dann sortiere alle Werte, deren Spalte 1- und Spalte 2-Wert gleich ist, nach der 3. Spalte
    usw.
    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!
    @ nafets3646
    Hatte grad Lust, ein Beispiel dafür zu machen, also bekommst du eins ;).
    Schau dir mal dieses Beispiel an, das könntest du auch auf dein System übertragen:

    VB.NET-Quellcode

    1. Public Class Land
    2. Public Property Name As String
    3. Public Property BundesLänder As List(Of BundesLand)
    4. Public Sub Sort()
    5. 'Die Bundesländer sortieren
    6. ...

    Vielen Dank für das Beispiel!
    Ich habe mir passende Klassen gebaut.
    Nun stehe ich leider noch etwas auf dem Schlauch wie ich die Werte von meinem Array in die List(of T) Elebemte der Klassen bekomme und wie ich nach dem Sortieren wieder ein multidimensionales Array daraus erzeugen kann (welches ich leider nach dem Sortieren wieder benötige).
    Kannst du mir hierzu einen Tipp geben?

    @ RodFromGermany
    Dann sortiere alles zunächst nach Spalte 1.
    Dann sortiere alle Werte, deren Spalte 1-Wert gleich ist, nach der 2. Spalte,
    Dann sortiere alle Werte, deren Spalte 1- und Spalte 2-Wert gleich ist, nach der 3. Spalte
    usw.
    Ja, das ist das was ich oben meinte / beschrieben habe:
    Die Lösung sieht vermutlich so aus:
    1. Sortiere Thema
    2. innerhalb jedes Themas sortiere Unterthema
    3. innerhalb jedes Unterthemas sortiere Weiteres Unterthema1
    4. innerhalb jedes Unterthemas sortiere Weiteres Unterthema2
    5. innerhalb jedes Unterthemas sortiere Weiteres Unterthema3
    Jedoch fehlte mir der Ansatz, wie ich den Sortierbereich von Spalte 2 auf gleiche Werte in Spalte 1 begrenzen kann. Falls du noch eine andere Idee hast, immer her damit :)

    Fischkopp_Hamburg schrieb:

    Falls du noch eine andere Idee hast
    Beschränke die Sortierung der Werte der 2. Spalte auf die Indizes, in denen der Wert der 1. Spalte gleich ist.
    Du musst Dir für jede Spalte eine Sortierroutine schreiben, der Du den jeweiligen Start- und Endindex mitgibst.
    Feddich.
    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!
    Alter wieso so umständlich?
    Ich habe keine Ahnung von dem Thema, aber 5 Sekunden googlen (c# multi sort) später:

    VB.NET-Quellcode

    1. Dim sorted = list1 _
    2. .OrderBy(Function(a) a.e1) _
    3. .ThenBy(Function(a) a.e2) _
    4. .ThenBy(Function(a) a.e3).ToList()


    Problem solved.
    Was hat das Problem mit Arrays zu tun? erst mal gar nix.
    Wenn es "nur" darum geht Datensätze der Klasse

    VB.NET-Quellcode

    1. Class Catalog
    2. Public thema As Integer
    3. Public unterthema As Integer
    4. Public unterunterthema As Integer
    5. ...
    6. End Class


    zu sortieren, dann kann man einfach ne List(Of Catalog) verwenden und dann über die oben gepostete Lösung sortieren.

    Das wäre die Lösung für das Problem
    Dann sortiere alles zunächst nach Spalte 1.
    Dann sortiere alle Werte, deren Spalte 1-Wert gleich ist, nach der 2. Spalte,
    Dann sortiere alle Werte, deren Spalte 1- und Spalte 2-Wert gleich ist, nach der 3. Spalte


    Die Problemstellung
    1. Sortiere Thema
    2. innerhalb jedes Themas sortiere Unterthema
    3. innerhalb jedes Unterthemas sortiere Weiteres Unterthema1
    4. innerhalb jedes Unterthemas sortiere Weiteres Unterthema2
    5. innerhalb jedes Unterthemas sortiere Weiteres Unterthema3

    ist gar nicht lösbar, weil du das Unterthema nicht nach verschiedenen Kriterien sortieren kannst. (Ich nehme mal an es gut um Datensätze und nicht um unabhängige Listen)
    @FischKopf:
    Deine Anforderung ist widersprüchlich.
    Zum einen zeigst du eine genau 2-dimensionale Matrix, dargestellt als 2d-Array.

    Deine Erklärungen zeigen aber eine Baumstruktur, also ein wesentlich flexibleres Datenmodell als eine 2d-Matrix.

    Ein Baum kann beliebig tief verschachtelt sein (also wirkliche n-dimensionalität - nicht nur 1D oder 2D)

    Und jede ChildNodes-Auflistung hat auch ihre eigene Anzahl von Elementen (während dein 2D-Array die unter-Elemente immer nur genau 6 lang sind).

    Für einen Katalog, wie ich ihn verstehe, also mit Kapiteln, Unter....Kapiteln, ist ein 2D-Array als Datenmodell schon von vornherein nicht geeignet - da brauchst du garnicht erst übers sortieren nachzudenken.
    Zunächst einmal danke ich Euch allen für die Antworten.

    @ ErfinderDesRades

    Der Wiederspruch den Du bemerkt hast gibt es tatsächlich, auch in den Daten.
    Ich erkäre es mal mit den echten Daten:

    Rein kommen die Daten folgendermaßen:

    Spoiler anzeigen




    10002065$10047627$10047635$10027433$Anaemia
    megaloblastic$Vitamin deficiencies NEC$Vitamin related disorders$Metabolism
    and nutrition disorders$Metab$$10005329$N$


    10002068$10028941$10028920$10036585$Anaemia
    neonatal$Neonatal haematologic disorders (excl blood
    incompatibility)$Neonatal and perinatal conditions$Pregnancy, puerperium and
    perinatal conditions$Preg$$10005329$N$


    10002967$10026847$10002086$10005329$Aplastic
    anaemia$Marrow depression and hypoplastic anaemias$Anaemias nonhaemolytic and
    marrow depression$Blood and lymphatic system disorders$Blood$$10005329$Y$


    10063084$10039164$10019280$10007541$Chronic
    right ventricular failure$Right ventricular failures$Heart failures$Cardiac
    disorders$Card$$10007541$Y$


    Plus


    10002065$Anaemia
    megaloblastic$10002065$0556001$$ANEMIA MEGALOBLAST$$$$Y$0162$


    10002298$Anemia
    megaloblastic$10002065$$$ANEMIA MEGALOBLAST$$$$Y$$


    10027128$Megaloblastic anaemia
    NOS$10002065$$$$$$$Y$$



    Es sind zwei source files die ich im Verlauf merge.

    Raus kommt das folgende Katalogfile:



    Das Funktioniert auch gut soweit, jedoch nur solange die source files vorsortiert sind. Wenn die Files nicht sortiert sind kommt ein "Kraut und Rüben" Katalogfile raus. Deshalb benötige ich einen Sortieralgorithmus um das array gemäß Katalogformat zu sortieren.
    Dass es nicht besonders elegant ist mit Arrays zu arbeiten anstelle von Objecten ist mir nun klar gewoerden - jedoch steht der gesamte code vor und hinter dem sortieren (Import, mergen und aufbereitung - d.h. löschen doppelter einträge wie im Screenshot zu sehen) bereits und funktioniert gut.
    PS:
    Ich würde auch den Umweg nehmen das Array in Objekte zu transferieren um nach der Sortierung wieder zum Array zurück zu kehren - performance spielt keine Rolle.
    ... ich hoffe ihr helft mir auch wenn ich mit dem Ansatz [Array -> Objekte -> Sortieren -> Array] sicherlich in die Programmierer-Hölle komme:D

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

    also aus dem Bildle werd ich nicht schlau.
    Ist das ein Abbild der Daten, soll das ein multidimensionales Array sein?

    ich jdfs. sehe eine Tabelle mit 10 Spalten.
    Einträge sind immer rechtsbündig, und nur bei zeilen #2 und #3 sind alle Spalten belegt.
    zeile#1 ist noch schlimmer, denn die ist nicht rechtsbündig belegt, sondern jede 2. Spalte.

    äh - ja, und was ist das nun, und wie wäre das zu sortieren?