Offensichtlich haben sich die Vorteile einer Arraylist gegenüber einem normalen Array noch immer nicht überall herumgesprochen. Daher wird noch immer munter mit Arrays gearbeitet, was nicht immer sinnvoll ist.
Grundlagen
Elemente einer Arraylist hinzufügen | ArrayL.Add(“Text”) |
Elemente an eine bestimmte Position hinzufügen | ArrayL.Insert(index,”Text”) |
Elemente aus der Arraylist entfernen | ArrayL.Remove(“Text”) |
Element einer bestimmten Position entfernen | ArrayL.RemoveAt(index) |
ArrayList sortieren | ArrayL.Sort |
prüfen, ob eine Arraylist ein bestimmtes Element enthält | ArrayL.Contains(“Text”) |
Beispiel
Erläuterung des Codes:
- Die
Button1_Click
-Methode wird ausgeführt, wenn der Benutzer auf einen Button namensButton1
klickt. - Eine
ArrayList
namensItemList
wird erstellt und mit String-Elementen gefüllt. - Die Elemente der
ArrayList
werden zunächst in einer MessageBox angezeigt. - Ein neues Element wird an einer spezifischen Position eingefügt, die Liste wird sortiert, ein Element wird entfernt, und ein weiteres Element wird an einem spezifischen Index entfernt.
- Schließlich werden die verbleibenden Elemente in der
ArrayList
in einer MessageBox angezeigt.
Warum eine Arraylist anstelle eines Arrays?
Grundsätzlich ähnelt die ArrayList einem Array in der Beziehung, dass eine beliebige Anzahl von Objekten aufgenommen werden kann. Anders als bei einem Array werden dabei jedoch die Objekte nicht über ihren Index eingefügt, sondern über die Add.Methode. Somit entfällt das Redimensionieren des Arrays. Dies ist insbesondere vor dem Hintergrund, dass ein Redim Preserve gerade bei großen Arrays recht lange dauert, von großer Bedeutung.
Bei 100 Elementen spielt dies noch keine relevante Rolle, bei 1000 Elementen liegt der Duchschnitt bei 1000 Durchläufen beim Array bei 2,3 ms bei der Arraylist hingegen bei knapp über 1ms:
Bei 10.000 Elementen wird der Unterschied wesentlich größer. 103ms für den Array vs. 11,5 ms für die Arraylist.
Bei 100.000 Elementen vergeht einem das Spaß an den Arrays, mit Zeiten von mehr als 40.000 ms.
Und was ist mit List(of T)
List(of T) steht der Arraylist in Punkto Performance um nichts nach. Die beiden stellen grundsätzlich die selben Funktionen zur Verfügung (.Add, Remove, RemoveAT, Insert ….) Sie unterscheiden sich grundsätzlich nur dadurch, dass List(of T) von vornherein den Typ festlegt, der in ihr gespeichert wird. List(of String), List(of Double) usw.
Arraylists in VBA?
Wenn nun Arraylists um soviel schneller sind als Arrays, dann stellt sich die Frage, wie man sich in VBA verhalten sollte. Kann man denn auch in VBA Arraylists verwenden? Die Antwort ist ja, sofern man den entsprechenden Verweis setzt. Eine Alternative stellt die VBA.Collection dar.
Erläuterung:
Test
ist eine Funktion, die eineCollection
-Objekt erstellt und mit Strings befüllt. Jeder String ist von der Form “Test X”, wobei X eine Zahl von 1 bis 100 ist.- Das erste Element der Collection (
myCollection(1)
) wird als Rückgabewert der Funktion verwendet.
Erläuterung:
Test2
ist eine Funktion, die eine .NETArrayList
über ein spät gebundenes COM-Objekt (CreateObject("System.collections.arraylist")
) erstellt.- Es werden ebenfalls 100 Elemente hinzugefügt. Beachten Sie, dass
ArrayList
bei 0 zu zählen beginnt, daher gibtobjArrLst(1)
das zweite Element zurück.