Array rotieren?

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Unwesen.

    Array rotieren?

    Also, ich möchte den Inhalt eines Arrays nach links rotieren lassen und wüsste gerne, ob es eine einfachere Methode gibt, als die, die ich derzeit benutze:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. 'Used: 1 Timer, 1 Label
    2. Public Class Form1
    3. Dim chTemp As Char
    4. Dim arTest1(7) As String
    5. Dim arTest2(7) As String
    6. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    7. Me.DoubleBuffered = True 'damits net flackert
    8. arTest1 = {"0", "0", "0", "0", "0", "0", "0", "1"}
    9. Timer1.Interval = 100
    10. Timer1.Start()
    11. End Sub
    12. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    13. chTemp = arTest1(0) 'Erstes Zeichen retten
    14. For i As Integer = 0 To 6
    15. arTest2(i) = arTest1(i + 1) 'Array rotieren
    16. arTest1(i) = arTest2(i)
    17. Next
    18. arTest1(7) = chTemp 'Zeichen hinten wieder einfügen
    19. 'Zur visuellen Verdeutlichung:
    20. Label1.Text = ""
    21. For i As Integer = 0 To 7
    22. Label1.Text = Label1.Text & arTest1(i)
    23. Next
    24. End Sub
    25. End Class
    @Unwesen:
    Einfacher und kürzer gehts wohl mit LINQ:
    Hier eine Funktion, die ein beliebiges Array um n nach links rotiert:

    VB.NET-Quellcode

    1. Private Function RotateArrayLeft(ByVal array As Object(), ByVal n As Integer)
    2. Return array.Skip(n).Take(array.Length - n).Concat(array.Take(n)).ToArray
    3. ' Überspringe n Elemente, nehme die restlichen Elemente und vereine diese mit den ersten n Elementen.
    4. End Function

    Jetzt musst du nur noch "Object()" entsprechend ändern, oder dein Array in ein Object-Array konvertieren.

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

    @ SystemUnknow
    Ich sehe jetzt nicht, wie das mir helfen würde. Ich will ja nur den Inhalt eines Array rotieren, nicht irgendwas auf meinem Screen.

    00000001
    00000010
    00000100
    00001000
    00010000
    00100000
    00100000
    01000000
    10000000


    Meine Methode ist ja soweit ok, wenn das Array nicht besonders Groß ist, aber wenn ich dann das gleiche mit einem Array mit z.B. 500 Elementen machen will, kostet das recht viel Rechenzeit. Ich hatte gehofft, dass VB vielleicht eine entsprechende Funktion für Arrays bietet. So etwas wie i8086.de/asm/8086-88-asm-rol.html , aber eben nicht für einen einzelnen Wert, sondern für Arrays?

    //Edit:

    Ah, eine passendere Antwort.
    Werde ich mir mal ansehen, danke schonmal.

    //Edit 2:
    Ok, das funktioniert, mal sehen, ob es auch bessere Performance bietet.

    Nach Links geht es offenbar mit

    VB.NET-Quellcode

    1. arTest1 = RotateArrayRight(arTest1, 1)

    und nach rechts mit

    VB.NET-Quellcode

    1. arTest1 = RotateArrayRight(arTest1, 7)

    bei meinem 8 Elemente Array.

    //3 @SystemUnknow
    Ganz Sinnlos war dein Link nicht. Mit der Fragestellung hatte es zwar nicht viel zu tun, aber ich hab ihn schonmal als Lesezeichen gespeichert. ;)

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