Eine Dimension eines zweidimensionalen Arrays zurück geben

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von hal2000.

    Eine Dimension eines zweidimensionalen Arrays zurück geben

    Hallo,

    ich hab ein Array

    VB.NET-Quellcode

    1. temp (3,9)

    und möchte nun alle Inhalte einer Reihe zurückgeben.

    also

    VB.NET-Quellcode

    1. temp (0,5)
    2. temp (1,5)
    3. temp (2,5)
    4. temp (3,5)


    Mir fällt gerade nicht ein, wie das auf einfache Art und Weise geht.

    Gruss

    mikeb69
    wir arbeiten in der schule im moment mit arrays (C++)
    Probier es mal mit einer For schleife..

    Quellcode

    1. for (int i = 0; i < 4; i++)
    2. {
    3. cout << temp(i,5) << endl;
    4. }


    müsste so gewesen sein, das musst du eben in VB umändern
    ist es das was du meintest ?
    Die Inhalte dann in einem 1 Dimensionalen Array?

    Also ich würde es so machen

    VB.NET-Quellcode

    1. Public Function OneDimension(MeinArray() As DeinDatenTyp, SecondDimension As Integer) As DeinDatenTyp()
    2. Dim tmpArray As DeinDatenTyp(MainArray.Length - 1)
    3. For i As Integer = 0 To MainArray.Length - 1
    4. tmpArray(i) = MeinArray(i, SecondDimension)
    5. Next
    6. Return tmpArray
    7. End Function


    Aufruf dann

    VB.NET-Quellcode

    1. OneDimension(einArray, 5)


    Wohlmöglich gibts auch eine LinQ Lösung, aber damit kenne ich mich nicht aus.
    @Dodo,
    schau ma bitte den Link bei mich.

    VB.NET-Quellcode

    1. Dim highest, bigArray(10, 15, 20), littleArray(6) As Integer
    2. highest = UBound(bigArray, 1)'gibt ne 10 zurück
    3. highest = UBound(bigArray, 3)'gibt ne 20 zurück
    4. highest = UBound(littleArray)'gibt ne 6 zurück
    Da steht nirgends was von VB6, gibt aber genau das zurück, was Mike haben wollte: Die Länge der einzelnen Dimensionen des Arrays.
    :)

    Edit:
    Noch ne alternative ist GetLenght.
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Aber die Länge eines Arrays ist ungleich des Inhaltes eines Arrays ^^

    Quellcode

    1. temp(0, 5) = "Hallo"
    2. temp(1, 5) = "foo"
    3. temp(2, 5) = "bar"
    4. temp(3, 5) = "test"


    Das möchte mike haben, alle 4 Werte der 5. Dimension seines Arrays. Mit der UBound oder GetLength würde er ja nur die Zahl 4 bekommen, was ihm ja nicht wirklich weiter hilft =)
    Genau das meintich doch die ganze Zeit.

    VB.NET-Quellcode

    1. Sub test()
    2. Dim a(8, 12) As String
    3. 'Ausgabe der Zeile 5
    4. For i = 0 To a.GetLength(1) - 1 'Länge (Count) der 1.Dimension als Zählvariable
    5. Console.WriteLine("a({0},5) = {1}", i, a(i, 5)) 'Ausgabe aller Werte der Zeile 5
    6. Next
    7. End Sub


    Das ist zwar nicht getestet, sollte aber gehen. Ich bin unsicher, ob die Nummer der Dimension 0-basiert angegeben wird.
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    @mike, picoflop:
    Die Lösung mit jagged Arrays ist sinnvoll, hat aber eine Einschränkung: Man kann nur auf Zeilen schnell zugreifen. Ein Beispiel:

    VB.NET-Quellcode

    1. Dim arr(2)() As Int32
    2. arr(0) = {1,2,3}
    3. arr(1) = {4,5,6}
    4. arr(2) = {7,8,9}

    Wenn nun {3,6,9} (wie im Eingangspost) gefordert ist, braucht man trotzdem eine Schleife zum Kopieren. Aber es geht auch ohne: Wenn immer nur Spalten gefordert sind, kann man das Layout einfach umdrehen:

    VB.NET-Quellcode

    1. Dim arr(2)() As Int32
    2. arr(0) = {1,4,7}
    3. arr(1) = {2,5,8}
    4. arr(2) = {3,6,9}

    Sind beide Varianten (Zeilen und Spalten) gefordert, könnte man mit viel Aufwand eine Datenstruktur schreiben, die für beide Fälle ein IEnumerable zurückgibt, sodass der Kopiervorgang in ein anderes Array nicht anfällt. Allerdings sind die Kosten für den Zugriff auf ein einzelnes Element dann nicht mehr in O(1).

    Edit: Kurzes Nachdenken zeigt: Die oben genannte Datenstruktur würde alle Operationen (Einzelelement, Zeile, Spalte) in O(2n) = O(n) erledigen. Das ist im Vergleich zum jagged Array (O(1), O(1), O(n)) schlechter. Der einzige Vorteil ist eine Speicherersparnis, da nicht das komplette 2-dimensionale Array im Speicher liegen muss, sondern nur die tatsächlich belegten Elemente.
    Gruß
    hal2000

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