Zweidimensionales Array sortieren

  • VB.NET

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

    Zweidimensionales Array sortieren

    Hallo liebes VB Forum, :)

    Ich bin Anfänger in Visual Basic 2010 Express, und möchte gerne ein 2 Dimensionales Array sortieren.
    Ich habe mich bereits etwas im Internet eingelesen wie man da am besten vorgehen kann.

    Scheinbar ist es am einfachsten wenn man das das 2 Dim Array als Objekt deklariert und in einer separaten Klasse sortiert.

    Mein Array heisst stempel(i,1)

    Hierbei sind stempel(i,0) double werte und stempel(i,1) sind integer

    Jetzt möchte ich das array nach den größten Zahlenwerten von stempel(i,0) sortieren.

    Wie stelle ich das am besten an ? ;(



    Grüße
    Labor7


    Aus dem Sourcecode-Austausch verschoben
    -Artentus

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

    Labor7 schrieb:

    stempel(i,0) double werte und stempel(i,1) sind integer
    Wie genau hast Du denn dieses Array deklariert?
    Gib Deinem Projekt zunächst Option Strict On, korrigiere alle angezeigten Fehler und dann sehen wir weiter.
    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!
    Hi RodFromGermany,

    Danke für deine Antwort.
    Ich habe das Array wie folgt deklariert:

    Dim stempel(i,1) as Object

    Ich hab mir noch mal alles durchgelesen und ich glaube ich muss ergänzen:
    Ich möchte mein Array mit i Zeilen und 2 Spalten sortieren. Es soll dabei nach den größten Werten in der ersten Spalte sortiert werden, wobei die Werte aus der zweiten Spalte einfach mitgenommen werden sollen.

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

    Stell mal auf Option Strict On! Visual Studio - Empfohlene Einstellungen
    Was speicherst du im Array? Object ist in 99.9 % ungeeignet. Eventuell erstellst du dir eine Klasse, oder du nutzt ein Dictionary. Das kann sogar automatisch sortieren.

    //Edit: Nö, kanns nicht. Aber LINQ hat da was feines (s. u.). Ein Dictionary ist höchstwahrscheinlich für deinen Zweck besser geeignet. BTW: Nutzt du irgendwo ReDim um das Array zu befüllen?

    //Edit2: LINQ:

    C#-Quellcode

    1. // Example dictionary
    2. var dictionary = new Dictionary<string, int>(5);
    3. dictionary.Add("cat", 1);
    4. dictionary.Add("dog", 0);
    5. dictionary.Add("mouse", 5);
    6. // Order by keys
    7. var items = from pair in dictionary
    8. orderby pair.Key ascending
    9. select pair;
    10. // Display results
    11. foreach (KeyValuePair<string, int> pair in items)
    12. {
    13. Console.WriteLine("{0}: {1}", pair.Key, pair.Value);
    14. }
    Mit freundlichen Grüßen,
    Thunderbolt

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

    Labor7 schrieb:

    Dim stempel(i,1) as Object
    So wird das nicht gehen, den einem solchen Element kannst Du auch den String "Roullade mit Klößen" zuweisen.
    Arbeite typsicher.
    Das einfachste ist, Du machst 2 Arrays, eins für Integer, eins für Double und sortierst so:

    VB.NET-Quellcode

    1. Dim ival() As Integer = {2, 3, 1, 4, 6, 4}
    2. Dim dval() As Double = {2.2, 3.4, 1.6, 4.6, 6.9, 4.7}
    3. Array.Sort(ival, dval)
    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!
    In die erste Spalte speichere ich Double-Werte und in die zweite Spalte werden Integer-Werte gespeichert.
    Die Werte stehen auch alle richtig drinnen und man kann damit arbeiten. Leider helfen sie mir in dieser Reihenfolge aber nichts.

    Danke für die Hilfe soweit, aber ihr versteht mich falsch...

    Der Double-Wert, der in der ersten Zeile und ersten Spalte steht soll fest mit dem Integer-Wert in der ersten Zeile und zweiten Spalte gekoppelt sein, deswegen kann ich nicht zwei verschiedene Arrays verwenden.

    Vorher sieht es veranschaulicht so aus: --------- Danach soll es so aussehen:

    6.3 / 1 ------------- 6.3 / 3
    2.2 / 4 ------------- 6.3 / 1
    5.6 / 3 ------------- 5.6 / 3
    1.0 / 8 ------------- 4.8 / 6
    6.3 / 3 ------------- 2.2 / 4
    4.8 / 6 ------------- 1.0 / 8

    Ich hoffe jetzt konnte ich mich einigermaßen verständlich ausdrücken :/

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Labor7“ ()

    Labor7 schrieb:

    In die erste Spalte speichere ich Double-Werte
    Schreib in dieser Code-Datei in die alleroberste Zeile 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!
    Ich kann mich nur wiederholen.

    Thunderbolt schrieb:



    Thunderbolt schrieb:

    Ein Dictionary ist höchstwahrscheinlich für deinen Zweck besser geeignet. BTW: Nutzt du irgendwo ReDim um das Array zu befüllen?
    Mit freundlichen Grüßen,
    Thunderbolt

    Labor7 schrieb:

    deswegen kann ich nicht zwei verschiedene Arrays verwenden.
    Dann mach zueerst Option Strict On und Dir dann eine Struktur, die aus einem Integer und einem Double besteht.
    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!
    Hi
    jep. Struktur oder Klasse anlegen und anhand von Array.Sort sortieren. Sollte man ja einen Delegaten angeben können, wenn ich mich richtig erinnere:

    VB.NET-Quellcode

    1. 'Array mit ein paar willkürlich gewählten Elementen erzeugen
    2. Dim myArray As MyClass() = Enumerable.Range(0, 10).Select(Function(x) New MyClass(x)).ToArray()
    3. 'Sortieren über Delegaten, Function(x, y) x.Value.CompareTo(y.Value) gibt die Sortierung an
    4. 'CompareTo liefert für x < y den Wert -1, für x = y 0, für x > y 1 (bzw. ein ganzzahliges
    5. 'Vielfaches der jeweiligen Werte, weiß grad nicht, wie die Definition exakt lautet)
    6. Array.Sort(myArray, Function(x, y) x.Value.CompareTo(y.Value))

    VB.NET-Quellcode

    1. Public Class MyClass
    2. 'Feld für den Wert anlegen
    3. Private _value As Integer
    4. 'und in einer Eigenschaft kapseln (macht man so, falls unbekannt. Felder werden normalerweise nicht öffentlich gemacht)
    5. Public Property Value As Integer
    6. Get
    7. Return _value
    8. End Get
    9. Private Set(value As Integer)
    10. _value = value
    11. End Set
    12. End Property
    13. 'Ermöglicht eben die Schreibweise foo = New MyClass(IntegerWert)
    14. Public Sub New(value As Integer)
    15. Me.Value = value
    16. End Sub
    17. End Class


    Gruß
    ~blaze~