HowTo: |
Arrays dynamisch erweitern und sortieren mit VBScript |
Arrays dynamisch erweitern
In VBscripts benötigt man oft Arrays zur Organisation von Daten. Immer wieder stellt sich
hier die Aufgabenstellung, ein Array am Anfang leer zu "erstellen" und dann nach und
nach dynamischen mit einer Anzahl von Elementen zu füllen. Dies erreicht man mit dem Kommando ReDim.
Wichtig zu wissen:
- Der Redim-Befehl erwartet als Parameter den oberen Index (Upper
Boundary) des vergrößerten Arrays. Dies ist etws anderes
als die Anzahl der Elemente (Array-Indizes beginnen bei 0 !).
- Man darf den Zusatz Preserve auf keinen Fall vergessen, denn sonst
wird der Inhalt des Arrays bei der Vergrößerung verloren
gehen.
Ein Beispiel:
For i = 1 To 500 ' so oft man will kann man jetzt...
Redim Preserve myArray(Ubound(myArray)+1) ' ...das Array vergrössern
myArray(Ubound(myArray)) = i ' ...und ein neues Element (hier i als Beispiel) hinzufügen
Next
Arrays sortieren
Um ein Array zu sortieren, kann man auf diverse Algorithmen zurückgreifen. Eine Sortiermethode, die auch bei großen Arrays gute Ergebnisse bringt, ist ShellSort:
ShellSort myArray, False ' das Array wird aufsteigend sortiert
For i = 0 To UBound(myArray) ' sortiertes Array ausgeben
WScript.Echo myArray(i)
Next
Sub ShellSort(ByRef arr, ByVal descending) ' die ShellSort Funktion
Dim value, index, index2, distance, lastEl, numEls ' ...erster Parameter: Arrayd
' ...zweiter Parameter: absteigend sortieren ?
lastEl = UBound(arr)
numEls = lastEl + 1
distance = 1
Do
distance = distance * 3 + 1
Loop Until distance > numEls
Do
distance = distance \ 3
For index = distance To lastEl
value = arr(index)
index2 = index
Do While (arr(index2 - distance) > value) Xor descending ' Vergleich !!
arr(index2) = arr(index2 - distance)
index2 = index2 - distance
If index2 - distance < 0 Then Exit Do
Loop
arr(index2) = value
Next
Loop Until distance = 1
End Sub
Diese Implementation des ShellSort-Algorithmus setzt allerdings voraus, dass sich die Elemente des Arrays direkt mit ">" vergleichen lassen. Handelt es sich um komplerere Datentypen, so müssen sie die Zeile mit dem Vergleich entsprechend anpassen.