In indizierten Arrays wird eine Reihe aus einem oder mehreren Werten gespeichert, die so angeordnet sind, dass auf jeden Wert über eine vorzeichenlose Ganzzahl zugegriffen werden kann. Die erste Indexposition ist immer die Zahl 0. Mit jedem dem Array hinzugefügten Element wird der Index um den Wert 1 erhöht. In ActionScript 3.0 werden zwei Klassen als indizierte Arrays verwendet: die Array-Klasse und die Vector-Klasse.
Bei indizierten Arrays wird für die Indexnummer eine vorzeichenlose 32-Bit-Ganzzahl verwendet. Die maximale Größe eines indizierten Arrays beträgt 2
32
- 1 oder 4.294.967.295. Beim Versuch, ein Array zu erstellen, das größer ist als die maximale Größe, wird zur Laufzeit eine Fehlermeldung ausgegeben.
Zum Zugriff auf ein einzelnes Element in einem indizierten Array verwenden Sie den Array-Zugriffsoperator (
[]
), um die Indexposition des gewünschten Elements anzugeben. Der folgende Code repräsentiert beispielsweise das erste Element (das Element an Indexposition 0) in einem indizierten Array namens
songTitles
:
songTitles[0]
Aus der Kombination des Array-Variablennamens gefolgt von der Indexposition in eckigen Klammern ergibt sich ein einzelner Bezeichner. (Das heißt, der Bezeichner kann genau wie jeder Variablenname verwendet werden.) Sie können einem Element eines indizierten Arrays einen Wert zuweisen, indem Sie den Namen und die Indexposition auf der linken Seite einer Zuweisungsanweisung verwenden:
songTitles[1] = "Symphony No. 5 in D minor";
Gleichermaßen können Sie den Wert eines Elements in einem indizierten Array abrufen, indem Sie den Namen und die Indexposition auf der rechten Seite einer Zuweisungsanweisung verwenden:
var nextSong:String = songTitles[2];
Die eckigen Klammern können anstelle eines expliziten Wertes auch eine Variable enthalten. (Die Variable muss eine nichtnegative Ganzzahl enthalten, wie beispielsweise „uint“, „positive int“ oder eine Number-Instanz mit einer positiven Ganzzahl). Dieses Verfahren wird häufig verwendet, um die Elemente in einem indizierten Array in einer Schleife zu durchlaufen und einen Vorgang für einige oder alle Elemente auszuführen. Im folgenden Codebeispiel wird dieses Verfahren veranschaulicht. Der Code verwendet eine Schleife für den Zugriff auf jeden Wert in einem Array-Objekt namens
oddNumbers
. Mit einer
trace()
-Anweisung wird jeder Wert im Format „oddNumber[
Index
] =
Wert
“ gedruckt:
var oddNumbers:Array = [1, 3, 5, 7, 9, 11];
var len:uint = oddNumbers.length;
for (var i:uint = 0; i < len; i++)
{
trace("oddNumbers[" + i.toString() + "] = " + oddNumbers[i].toString());
}
Die Array-Klasse
Der erste Typ eines indizierten Arrays ist die Array-Klasse. Eine Array-Instanz kann einen Wert eines jeden Datentyps enthalten. Ein Array-Objekt kann Objekte enthalten, die unterschiedliche Datentypen aufweisen. So kann eine Array-Instanz beispielsweise bei Index 0 einen Stringwert enthalten, bei Index 1 eine Number-Instanz und bei Index 2 ein XML-Objekt.
Die Vector-Klasse
In ActionScript 3.0 ist als weiterer Typ eines indizierten Arrays die Vector-Klasse verfügbar. Bei einer Vector-Instanz handelt es sich um ein
Typ-Array
. Dies bedeutet, dass alle Elemente einer Vector-Instanz stets denselben Datentyp aufweisen.
Hinweis:
Die Vector-Klasse ist verfügbar ab Flash Player 10 und Adobe AIR 1.5.
Beim Deklarieren einer Vector-Variablen oder beim Instanziieren eines Vector-Objekts geben Sie den Datentyp der enthaltenen Objekte explizit an. Der angegebene Datentyp wird als
Basistyp
des Vektors bezeichnet. Zur Laufzeit und bei der Kompilierung (im strikten Modus) wird der ganze Code überprüft, der den Wert eines Vector-Elements festlegt oder abruft. Wenn der Datentyp des hinzugefügten oder abgerufenen Objekts nicht mit dem Vector-Basistyp übereinstimmt, tritt ein Fehler auf.
Neben der Datentypbeschränkung unterscheidet sich die Vector-Klasse von der Array-Klasse noch durch weitere Beschränkungen:
-
Ein Vector ist ein dichtes Array. Ein Array-Objekt kann Werte an den Indexpositionen 0 und 7 enthalten, selbst wenn die Indexpositionen 1 bis 6 unbelegt sind. Dagegen muss ein Vektor an jeder Indexposition einen Wert (oder
null
) aufweisen.
-
Für einen Vektor kann wahlweise eine feste Länge angegeben werden. Dies bedeutet, dass sich die Anzahl der im Vektor enthaltenen Elemente nicht ändern kann.
-
Der Zugriff auf die Vector-Elemente ist begrenzt. Es kann kein Wert von einer Indexposition größer als das letzte Element (
length
- 1) gelesen werden. Es kann kein Wert festgelegt werden, der eine Indexposition von mehr als eins hinter der aktuellen letzten Indexposition aufweist (anders ausgedrückt, ein Wert kann nur an einer vorhandenen Indexposition oder an der Indexposition
[length]
festgelegt werden).
Aufgrund seiner Beschränkungen bietet ein Vektor drei wichtige Vorteile gegenüber einer Array-Instanz, bei deren Elementen es sich ausschließlich um Instanzen einer Klasse handelt:
-
Leistung: Bei einer Vector-Instanz erfolgen der Zugriff auf die Array-Elemente und die Iteration viel schneller als bei einer Array-Instanz.
-
Typsicherheit: Im strikten Modus kann der Compiler Datentypfehler erkennen. Solche Fehler treten beispielsweise auf, wenn einem Vektor ein Wert mit einem falschen Datentyp zugewiesen wird oder wenn beim Lesen eines Wertes von einem Vektor der falsche Datentyp erwartet wird. Zur Laufzeit werden die Datentypen auch überprüft, wenn Daten einem Vector-Objekt hinzugefügt oder von einem Vector-Objekt gelesen werden. Beachten Sie jedoch Folgendes: Wenn Sie einem Vektor mithilfe der
push()
- oder
unshift()
-Methode Werte hinzufügen, werden die Datentypen der Argumente bei der Kompilierung nicht überprüft. Bei Verwendung dieser Methoden werden die Werte jedoch zur Laufzeit überprüft.
-
Zuverlässigkeit: Die Laufzeit-Bereichsüberprüfung (oder Festlängenüberprüfung) erhöht die Zuverlässigkeit im Vergleich mit Arrays erheblich.
Abgesehen von den zusätzlichen Einschränkungen und Vorteilen entspricht die Vector-Klasse im Großen und Ganzen der Array-Klasse. Die Eigenschaften und Methoden eines Vector-Objekts ähneln den Eigenschaften und Methoden eines Arrays, in den meisten Fällen sind sie sogar identisch. In den meisten Fällen, in denen Sie ein Array verwenden würden, dessen Elemente alle denselben Datentyp aufweisen, ist es empfehlenswert, stattdessen eine Vector-Instanz zu verwenden.
Erstellen von Arrays
Array- oder Vector-Instanzen können mit mehreren Verfahren erstellt werden. Die Techniken zur Erstellung der einzelnen Array-Typen unterscheiden sich jedoch etwas.
Erstellen einer Array-Instanz
Sie erstellen ein Array-Objekt, indem Sie den
Array()
-Konstruktor aufrufen oder die Array-Literalsyntax verwenden.
Die
Array
-Konstruktorfunktion kann auf drei Arten verwendet werden. Wenn Sie erstens den Konstruktor ohne Argumente aufrufen, wird ein leeres Array zurückgegeben. Mithilfe der
length
-Eigenschaft der Array-Klasse können Sie überprüfen, ob das Array über keine Elemente verfügt. Im folgenden Code wird der
Array()
-Konstruktor beispielsweise ohne Argumente aufgerufen:
var names:Array = new Array();
trace(names.length); // output: 0
Wenn Sie zweitens eine Zahl als einzigen Parameter des
Array()
-Konstruktors verwenden, wird ein Array mit der angegebenen Länge erstellt. Die Werte aller Elemente sind dabei jeweils auf
undefined
gesetzt. Das Argument muss eine vorzeichenlose Ganzzahl zwischen 0 und 4.294.967.295 sein. Mit dem folgenden Code wird der
Array()
-Konstruktor beispielsweise mit einem numerischen Argument aufgerufen:
var names:Array = new Array(3);
trace(names.length); // output: 3
trace(names[0]); // output: undefined
trace(names[1]); // output: undefined
trace(names[2]); // output: undefined
Wenn Sie drittens den Konstruktor aufrufen und eine Liste mit Elementen als Parameter übergeben, wird ein Array mit Elementen erstellt, die jeweils den einzelnen Parametern entsprechen. Mit dem folgenden Code werden drei Argumente an den
Array()
-Konstruktor übergeben:
var names:Array = new Array("John", "Jane", "David");
trace(names.length); // output: 3
trace(names[0]); // output: John
trace(names[1]); // output: Jane
trace(names[2]); // output: David
Sie können auch Arrays mit Array-Literalen erstellen. Ein Array-Literal kann einer Array-Variablen direkt zugewiesen werden, wie im folgenden Beispiel gezeigt:
var names:Array = ["John", "Jane", "David"];
Erstellen einer Vector-Instanz
Eine Vector-Instanz wird durch Aufrufen des
Vector.<T>()
-Konstruktors erstellt. Sie können einen Vektor auch erstellen, indem Sie die globale Funktion
Vector.<T>()
aufrufen. Diese Funktion wandelt ein angegebenes Objekt in eine Vector-Instanz um. In Flash Professional CS5 und höher, Flash Builder 4 und höher sowie in Flex 4 und höher können Sie eine Vector-Instanz auch erstellen, indem Sie eine Vector-Literalsyntax verwenden.
Wenn Sie eine Vector-Variable deklarieren (oder einen Vector-Methodenparameter oder den Rückgabetyp einer Methode), geben Sie immer den Basistyp der Vector-Variablen an. Sie geben den Basistyp auch an, wenn Sie eine Vector-Instanz erstellen, indem Sie den
Vector.<T>()
-Konstruktors erstellt. Anders ausgedrückt: Jede Verwendung des Begriffs
Vector
in ActionScript wird von einem Basistyp begleitet.
Sie geben den Vector-Basistyp mithilfe der type-Parametersyntax an. Der type-Parameter folgt im Code direkt auf das Wort
Vector
. Er besteht aus einem Punkt
.
) gefolgt vom Basisklassennamen in spitzen Klammern (
<>
), wie im folgenden Beispiel gezeigt:
var v:Vector.<String>;
v = new Vector.<String>();
In der ersten Zeile des Beispiels wird die Variable
v
als eine
Vector.<String>
-Instanz deklariert. Sie repräsentiert also ein indiziertes Array, das nur String-Instanzen enthalten kann. Mit der zweiten Zeile wird der
Vector()
-Konstruktor aufgerufen, um eine Instanz desselben Vector-Typs zu erstellen (also einen Vektor, dessen Elemente alle String-Objekte sind). Dieses Objekt wird
v
zugewiesen.
Verwenden des Vector.<T>()-Konstruktors
Wenn Sie den
Vector.<T>()
-Konstruktor ohne Argumente verwenden, wird eine leere Vector-Instanz erstellt. Sie können testen, ob der Vektor leer ist, indem Sie seine
length
-Eigenschaft überprüfen. Mit dem folgenden Beispielcode wird der
Vector.<T>()
-Konstruktor ohne Argumente aufgerufen:
var names:Vector.<String> = new Vector.<String>();
trace(names.length); // output: 0
Wenn bereits im Voraus bekannt ist, wie viele Elemente ein Vektor anfänglich benötigt, können Sie die Anzahl der Elemente im Vektor vorab festlegen. Zum Erstellen eines Vektors mit einer bestimmten Elementanzahl übergeben Sie die Anzahl der Elemente als ersten Parameter (
length
-Parameter). Da Vector-Elemente nicht leer sein dürfen, werden die Elemente mit Instanzen des Basistyps gefüllt. Wenn es sich beim Basistyp um einen Verweistyp handelt, der
null
-Werte zulässt, enthalten alle Elemente
null
. Andernfalls enthalten alle Elemente den Standardwert der Klasse. Beispielsweise kann eine uint-Variable nicht
null
sein. Deshalb wird im folgenden Codebeispiel der Vektor namens
ages
mit sieben Elementen erstellt, die alle den Wert 0 enthalten:
var ages:Vector.<uint> = new Vector.<uint>(7);
trace(ages); // output: 0,0,0,0,0,0,0
Schließlich können Sie mit dem
Vector.<T>()
-Konstruktor auch einen Vektor mit fester Länge erstellen. Dazu übergeben Sie den Wert
true
für den zweiten Parameter (
fixed
-Parameter). In diesem Fall wird der Vektor mit der angegebenen Elementanzahl erstellt, die sich nicht ändern kann. Die Werte für die Elemente eines Vektors mit fester Länge können jedoch nach wie vor geändert werden.
Verwenden des Vector-Literalsyntaxkonstruktors
In Flash Professional CS5 und höher, Flash Builder 4 und höher sowie Flex 4 und höher können Sie eine Liste mit Werten an den
Vector.<T>()
-Konstruktor übergeben, um die anfänglichen Vector-Werte festzulegen:
// var v:Vector.<T> = new <T>[E0, ..., En-1 ,];
// For example:
var v:Vector.<int> = new <int>[0,1,2,];
Für diese Syntax gelten die folgenden Informationen:
-
Das nachgestellte Komma ist optional.
-
Leere Elemente im Array werden nicht unterstützt; eine Anweisung wie
var v:Vector.<int> = new <int>[0,,2,]
führt zu einem Compilerfehler.
-
Sie können keine Standardlänge für die Vektorinstanz festlegen. Stattdessen ist die Länge mit der Anzahl der Elemente in der Initialisierungsliste identisch.
-
Sie können nicht angeben, ob die Vector-Instanz eine feste Länge hat. Verwenden Sie stattdessen die
fixed
-Eigenschaft.
-
Datenverluste oder -fehler können auftreten, wenn Elemente, die als Werte übergeben wurden, nicht dem angegebenen Typ entsprechen. Zum Beispiel:
var v:Vector.<int> = new <int>[4.2]; // compiler error when running in strict mode
trace(v[0]); //returns 4 when not running in strict mode
Verwenden des Vector.<T>()-Funktion
Zusätzlich zum
Vector.<T>()
- und zum Vector-Literalsyntaxkonstruktor können Sie auch die globale
Vector.<T>()
-Funktion verwenden, um ein Vector-Objekt zu erstellen. Bei der globalen
Vector.<T>()
-Funktion handelt es sich um eine Umwandlungsfunktion. Beim Aufruf der globalen
Vector.<T>()
-Funktion geben Sie den Vector-Basistyp an, der von der Methode zurückgegeben wird. Sie übergeben ein einzelnes indiziertes Array (Array- oder Vector-Instanz) als Argument. Die Methode gibt dann einen Vektor mit dem angegebenen Basistyp zurück, der die Werte im Argument des Quell-Arrays enthält. Das folgende Codebeispiel zeigt die Syntax für einen Aufruf der globalen
Vector.<T>()
-Funktion:
var friends:Vector.<String> = Vector.<String>(["Bob", "Larry", "Sarah"]);
Bei der globalen
Vector.<T>()
-Funktion wird eine Datenumwandlung auf zwei Ebenen durchgeführt. Erstens wird bei der Übergabe einer Array-Instanz an die Funktion eine Vector-Instanz zurückgegeben. Zweitens versucht die Funktion, die Elemente des Quell-Arrays in Werte des Basistyps umzuwandeln, unabhängig davon, ob es sich beim Quell-Array um eine Array- oder eine Vector-Instanz handelt. Bei der Umwandlung gelten die ActionScript-Standardregeln für die Datentypumwandlung. Im folgenden Codebeispiel werden die String-Werte im Quell-Array in Ganzzahlen im Ergebnisvektor umgewandelt. Im Ergebnis wird der Dezimalteil des ersten Wertes (
„1.5"
) gekürzt und der nicht numerische dritte Wert (
„Waffles"
) wird in 0 umgewandelt:
var numbers:Vector.<int> = Vector.<int>(["1.5", "17", "Waffles"]);
trace(numbers); // output: 1,17,0
Wenn eines der Quellelemente nicht umgewandelt werden kann, tritt ein Fehler auf.
Wenn beim Aufruf der globalen
Vector.<T>()
-Funktion ein Element im Quell-Array eine Instanz einer Unterklasse des angegebenen Basistyps ist, wird das Element dem Ergebnisvektor hinzugefügt. In diesem Fall tritt kein Fehler auf. Die globale Vector.
<T>()
-Funktion bietet die einzige Möglichkeit, um einen Vektor mit dem Basistyp
T
in einen Vektor umzuwandeln, bei dessen Basistyp es sich um eine übergeordnete Klasse von
T
handelt.
Einfügen von Array-Elementen
Am einfachsten können Sie einem indizierten Array ein Element hinzufügen, indem Sie den Array-Zugriffsoperator (
[]
) verwenden. Um den Wert eines Elements in einem indizierten Array festzulegen, verwenden Sie den Namen des Array- oder Vector-Objekts und die Indexnummer auf der linken Seite einer Zuweisungsanweisung:
songTitles[5] = "Happy Birthday";
Wenn im Array- oder Vector-Objekt noch kein Element an dieser Indexposition vorhanden ist, wird die Indexposition erstellt und der Wert wird an dieser Position gespeichert. Ist bereits ein Wert an dieser Indexposition vorhanden, wird der vorhandene Wert durch den neuen Wert ersetzt.
Mithilfe eines Array-Objekts können Sie an jeder Indexposition ein Element erstellen. Dagegen ist es mit einem Vector-Objekt nur möglich, eine vorhandene Indexposition oder der nächsten verfügbaren Indexposition einen Wert zuzuweisen. Die nächste verfügbare Indexposition entspricht der
length
-Eigenschaft des Vector-Objekts. Die sicherste Methode, einem Vector-Objekt ein neues Element hinzuzufügen, wird im folgenden Codebeispiel veranschaulicht:
myVector[myVector.length] = valueToAdd;
Mithilfe von drei Methoden der Array- und Vector-Klassen –
push()
,
unshift()
und
splice()
– können Sie Elemente in ein indiziertes Array einfügen. Mit der
push()
-Methode werden ein oder mehrere Elemente am Ende eines Arrays angehängt. Mit anderen Worten, das letzte mithilfe der
push()
-Methode in das Array eingefügte Element weist die höchste Indexnummer auf. Mit der
unshift()
-Methode werden ein oder mehrere Elemente am Anfang eines Arrays eingefügt, und zwar immer bei Indexposition 0. Mit der
splice()
-Methode wird eine beliebige Anzahl von Elementen an einer bestimmten Indexposition in einem Array eingefügt.
Im folgenden Beispiel werden alle drei Methoden veranschaulicht. Ein Array namens
planets
wird erstellt, um die Namen der Planeten in der Reihenfolge ihrer Nähe zur Sonne zu speichern. Als Erstes wird die
push()
-Methode aufgerufen, um das erste Element,
Mars
, hinzuzufügen. Dann wird die
unshift()
-Methode aufgerufen, um das Element
Mercury
(Merkur) am Anfang des Arrays einzufügen. Schließlich wird die
splice()
-Methode aufgerufen, um die Elemente
Venus
und
Earth
(Erde) nach
Mercury
, jedoch vor
Mars
einzufügen. Mit dem ersten an
splice()
übergebenen Argument, der Ganzzahl 1, wird angegeben, dass die Elemente an der Indexposition 1 eingefügt werden sollen. Mit dem zweiten an
splice()
gesendeten Argument, der Ganzzahl 0, wird angegeben, dass keine Elemente gelöscht werden sollen. Bei dem dritten und vierten Argument,
Venus
und
Earth
, die an
splice()
gesendet werden, handelt es sich um die einzufügenden Elemente.
var planets:Array = new Array();
planets.push("Mars"); // array contents: Mars
planets.unshift("Mercury"); // array contents: Mercury,Mars
planets.splice(1, 0, "Venus", "Earth");
trace(planets); // array contents: Mercury,Venus,Earth,Mars
Mit den Methoden
push()
und
unshift()
wird jeweils eine vorzeichenlose Ganzzahl zurückgegeben, die die Länge des geänderten Arrays angibt. Wenn die
splice()
-Methode zum Einfügen von Elementen verwendet wird, wird ein leeres Array zurückgegeben. Dies ist auf die Vielseitigkeit der
splice()
-Methode zurückzuführen. Sie können die
splice()
-Methode nicht nur zum Einfügen von Elementen in ein Array, sondern auch zum Entfernen von Elementen aus einem Array verwenden. Wenn die
splice()
-Methode zum Entfernen von Elementen verwendet wird, wird ein Array mit den entfernten Elementen zurückgegeben.
Hinweis:
Wenn die
fixed
-Eigenschaft eines Vector-Objekts auf
true
eingestellt ist, kann die Gesamtanzahl der Elemente im Vektor sich nicht ändern. Wenn Sie versuchen, einem Vector-Objekt mit fester Länge mithilfe der hier beschriebenen Verfahren ein neues Element hinzuzufügen, tritt ein Fehler auf.
Abrufen von Werten und Entfernen von Array-Elementen
Am einfachsten können Sie den Wert eines Elements aus einem indizierten Array abrufen, indem Sie den Array-Zugriffsoperator (
[]
) verwenden. Um den Wert eines Elements in einem indizierten Array abzurufen, verwenden Sie den Namen des Array- oder Vector-Objekts und die Indexnummer auf der rechten Seite einer Zuweisungsanweisung:
var myFavoriteSong:String = songTitles[3];
Es kann versucht werden, den Wert von einem Array- oder Vector-Objekt mithilfe eines Indexes abzurufen, an dem keine Elemente existieren. In diesem Fall gibt ein Array-Objekt den Wert „undefined“ zurück und ein Vector-Objekt gibt eine RangeError-Ausnahme aus.
Mit drei Methoden der Array- und Vector-Klassen –
pop()
,
shift()
und
splice()
– können Sie Elemente entfernen. Mit der
pop()
-Methode wird ein Element am Ende eines Arrays entfernt. Dies bedeutet, dass das Element mit der höchsten Indexnummer entfernt wird. Mit der
shift()
-Methode wird ein Element am Anfang eines Arrays entfernt. Dies bedeutet, dass immer das Element an Indexposition 0 entfernt wird. Mit der
splice()
-Methode, die auch zum Einfügen von Elementen verwendet werden kann, wird eine beliebige Anzahl von Elementen entfernt, angefangen bei der Indexposition, die durch das erste an die Methode gesendete Argument angegeben ist.
Im folgenden Beispiel werden Elemente mithilfe aller drei Methoden aus einer Array-Instanz entfernt. Ein Array namens
oceans
(Ozeane) wird erstellt. In diesem Array sollen die Namen großer Gewässer gespeichert werden. Einige der Elemente im Array sind Seen und keine Meere und sollen daher entfernt werden.
Mithilfe der
splice()
-Methode werden zunächst die Elemente
Aral
und
Superior
entfernt sowie die Elemente
Atlantic
und
Indian
eingefügt. Mit dem ersten an
splice()
gesendeten Argument, der Ganzzahl 2, wird angegeben, dass der Vorgang beim dritten Element in der Liste starten soll, an Indexposition 2. Mit dem zweiten Argument, 2, wird angegeben, dass zwei Elemente entfernt werden sollen. Die restlichen Argumente,
Atlantic
und
Indian
, sind die Werte, die bei Indexposition 2 eingefügt werden sollen.
Mithilfe der
pop()
-Methode wird dann das letzte Element,
Huron
, im Array entfernt. Schließlich wird mithilfe der
shift()
-Methode das erste Element,
Victoria
, im Array entfernt.
var oceans:Array = ["Victoria", "Pacific", "Aral", "Superior", "Indian", "Huron"];
oceans.splice(2, 2, "Arctic", "Atlantic"); // replaces Aral and Superior
oceans.pop(); // removes Huron
oceans.shift(); // removes Victoria
trace(oceans);// output: Pacific,Arctic,Atlantic,Indian
Bei den Methoden
pop()
und
shift()
werden jeweils die entfernten Elemente zurückgegeben. Bei einer Array-Instanz hat der Rückgabewert den Object-Datentyp, da Arrays Werte eines beliebigen Datentyps enthalten können. Bei einer Vector-Instanz entspricht der Datentyp des Rückgabewertes dem Vector-Basistyp. Die
splice()
-Methode gibt ein Array oder einen Vektor mit den Werten zurück, die entfernt wurden. Sie können das
oceans
-Array so ändern, dass das zurückgegebene Array durch Aufrufen von
splice()
einer neuen Array-Variablen zugewiesen wird, wie im folgenden Beispiel gezeigt:
var lakes:Array = oceans.splice(2, 2, "Arctic", "Atlantic");
trace(lakes); // output: Aral,Superior
Möglicherweise stoßen Sie auf Code, bei dem der
delete
-Operator für ein Array-Objektelement verwendet wird. Mit dem
delete
-Operator wird der Wert eines Array-Elements auf
undefined
gesetzt, das Element wird jedoch nicht aus dem Array entfernt. Im folgenden Codebeispiel wird der
delete
-Operator für das dritte Element des
oceans
-Arrays verwendet, die Länge des Arrays bleibt jedoch unverändert bei 5:
var oceans:Array = ["Arctic", "Pacific", "Victoria", "Indian", "Atlantic"];
delete oceans[2];
trace(oceans);// output: Arctic,Pacific,,Indian,Atlantic
trace(oceans[2]); // output: undefined
trace(oceans.length); // output: 5
Sie können ein Array oder einen Vektor mithilfe der
length
-Eigenschaft kürzen. Wenn Sie die
length
-Eigenschaft eines indizierten Arrays auf eine geringere Länge als die derzeitige Array-Länge einstellen, wird das Array gekürzt. Dabei werden die Elemente an den Indexpositionen entfernt, die den neuen Wert für
length
minus 1 übersteigen. Wenn das
oceans
-Array beispielsweise so sortiert ist, dass alle gültigen Einträge sich am Anfang des Arrays befinden, können Sie die
length
-Eigenschaft verwenden, um alle Einträge am Ende des Arrays zu entfernen, wie im folgenden Codebeispiel gezeigt:
var oceans:Array = ["Arctic", "Pacific", "Victoria", "Aral", "Superior"];
oceans.length = 2;
trace(oceans); // output: Arctic,Pacific
Hinweis:
Wenn die
fixed
-Eigenschaft eines Vector-Objekts auf
true
eingestellt ist, kann die Gesamtanzahl der Elemente im Vektor sich nicht ändern. Wenn Sie versuchen, mit den hier beschriebenen Verfahren einen Vektor mit fester Länge zu kürzen oder ein Element aus einem solchen Vektor zu entfernen, tritt ein Fehler auf.
Sortieren von Arrays
Mithilfe von drei Methoden –
reverse()
,
sort()
und
sortOn()
– können Sie die Reihenfolge in einem indizierten Array ändern, indem Sie die Elemente sortieren oder die bestehende Reihenfolge umkehren. Mit allen diesen Methoden wird ein vorhandenes Array geändert. In der folgenden Tabelle werden diese Methoden sowie ihr Verhalten bei Array- und Vector-Objekten zusammengefasst:
Methode
|
Array-Verhalten
|
Vector-Verhalten
|
reverse()
|
Ändert die Reihenfolge der Elemente so, dass das letzte Element zum ersten Element wird, das vorletzte Element zum zweiten Element und so weiter.
|
Mit Array-Verhalten identisch
|
sort()
|
Ermöglicht Ihnen das Sortieren der Array-Elemente in mehreren vordefinierten Reihenfolgen, wie beispielsweise alphabetisch oder numerisch. Sie können auch einen benutzerdefinierten Sortieralgorithmus angeben.
|
Sortiert die Elemente nach dem von Ihnen angegebenen benutzerdefinierten Sortieralgorithmus
|
sortOn()
|
Ermöglicht Ihnen das Sortieren von Objekten, die eine oder mehrere gemeinsame Eigenschaften aufweisen, wobei Sie die Eigenschaften angeben, die als Sortierschlüssel verwendet werden sollen.
|
In der Vector-Klasse nicht verfügbar
|
Die reverse()-Methode
Bei der
reverse()
-Methode werden keine Parameter verwendet und keine Werte zurückgegeben, Sie können mit dieser Methode jedoch die aktuelle Reihenfolge der Elemente in einem Array in die umgekehrte Reihenfolge ändern. Im folgenden Beispiel wird die Reihenfolge der im
oceans
-Array aufgeführten Meere geändert:
var oceans:Array = ["Arctic", "Atlantic", "Indian", "Pacific"];
oceans.reverse();
trace(oceans); // output: Pacific,Indian,Atlantic,Arctic
Einfaches Sortieren mit der sort()-Methode (nur Array-Klasse)
Bei einer Array-Instanz ändert die
sort()
-Methode die Anordnung der Elemente in einem Array entsprechend der
Standardsortierreihenfolge
. Die Standardsortierreihenfolge weist die folgenden Merkmale auf:
-
Bei der Sortierung wird die Groß- und Kleinschreibung beachtet. Dabei stehen Großbuchstaben vor Kleinbuchstaben. Der Buchstabe D steht beispielsweise vor dem Buchstaben b.
-
Die Sortierung erfolgt aufsteigend, d. h. niedrige Buchstabencodes (z. B. A) sind höheren Buchstabencodes (z. B. B) vorangestellt.
-
Bei der Sortierung werden identische Werte nebeneinander, jedoch in keiner bestimmten Reihenfolge positioniert.
-
Die Sortierung ist stringbasiert, d. h. Elemente werden vor dem Vergleichen in Strings konvertiert (10 steht z. B. vor 3, da der String
„1"
einen niedrigeren Buchstabencode hat als der String
„3"
).
Möglicherweise möchten Sie ein Array ohne Berücksichtigung der Groß- und Kleinschreibung oder in absteigender Reihenfolge sortieren. Unter Umständen enthält ein Array zudem Zahlen, die Sie numerisch und nicht alphabetisch sortieren möchten. Die
sort()
-Methode der Array-Klasse verfügt über einen
options
-Parameter, über den Sie die einzelnen Merkmale der Standardsortierreihenfolge ändern können. In der folgenden Aufstellung sind die einzelnen Optionen aufgeführt, die durch mehrere statische Konstanten der Array-Klasse definiert sind:
-
Array.CASEINSENSITIVE
: Bei Angabe diese Option wird die Groß- und Kleinschreibung bei der Sortierung nicht berücksichtigt. Der Kleinbuchstabe b steht dann beispielsweise vor dem Großbuchstaben D.
-
Array.DESCENDING
: Hierdurch wird die aufsteigende Standardsortierreihenfolge umgekehrt. Der Buchstabe B steht dann beispielsweise vor dem Buchstaben A.
-
Array.UNIQUESORT
: Hierdurch wird die Sortierung bei zwei identischen Werten abgebrochen.
-
Array.NUMERIC
: Hierdurch erfolgt eine numerische Sortierung, sodass 3 vor 10 steht.
Im folgenden Beispiel werden einige dieser Optionen aufgegriffen. Das Array namens
poets
(Dichter) wird erstellt und anhand mehrerer Sortieroptionen sortiert.
var poets:Array = ["Blake", "cummings", "Angelou", "Dante"];
poets.sort(); // default sort
trace(poets); // output: Angelou,Blake,Dante,cummings
poets.sort(Array.CASEINSENSITIVE);
trace(poets); // output: Angelou,Blake,cummings,Dante
poets.sort(Array.DESCENDING);
trace(poets); // output: cummings,Dante,Blake,Angelou
poets.sort(Array.DESCENDING | Array.CASEINSENSITIVE); // use two options
trace(poets); // output: Dante,cummings,Blake,Angelou
Benutzerdefiniertes Sortieren mit der sort()-Methode (Array- und Vector-Klassen)
Sie können nicht nur die einfachen Sortierungen verwenden, die für ein Array-Objekt verfügbar sind, sondern zudem auch eine benutzerdefinierte Sortierregel erstellen. Für die Vector-Klasse steht ausschließlich diese Technik der
sort()
-Methode zur Verfügung. Zum Definieren einer benutzerdefinierten Sortierung erstellen Sie eine benutzerdefinierte Sortierfunktion, die Sie als Argument an die
sort()
-Methode übergeben.
Wenn Sie eine Liste mit Namen, bei der alle Elemente den vollständigen Namen einer Person enthalten, beispielsweise nach Nachnamen sortieren möchten, müssen Sie eine benutzerdefinierte Sortierfunktion verwenden, damit alle Elemente analysiert werden und bei der Sortierfunktion der Nachname verwendet wird. Im folgenden Codebeispiel ist eine benutzerdefinierte Funktion dargestellt, die als Parameter der
Array.sort()
-Methode verwendet wird:
var names:Array = new Array("John Q. Smith", "Jane Doe", "Mike Jones");
function orderLastName(a, b):int
{
var lastName:RegExp = /\b\S+$/;
var name1 = a.match(lastName);
var name2 = b.match(lastName);
if (name1 < name2)
{
return -1;
}
else if (name1 > name2)
{
return 1;
}
else
{
return 0;
}
}
trace(names); // output: John Q. Smith,Jane Doe,Mike Jones
names.sort(orderLastName);
trace(names); // output: Jane Doe,Mike Jones,John Q. Smith
Bei der benutzerdefinierten Sortierfunktion
orderLastName()
wird mithilfe eines regulären Ausdrucks der Nachname jedes Elements extrahiert und für den Vergleichsvorgang verwendet. Der Funktionsbezeichner
orderLastName
wird als einziger Parameter beim Aufrufen der
sort()
-Methode für das
names
-Array verwendet. Für die Sortierfunktion werden zwei Parameter (
a
und
b
) angegeben, da die Funktion auf zwei Array-Elemente gleichzeitig angewendet wird. Der Rückgabewert der Sortierfunktion gibt die Sortierreihenfolge der Elemente an.
-
Der Rückgabewert -1 gibt an, dass der erste Parameter
a
vor dem zweiten Parameter
b
steht.
-
Der Rückgabewert 1 gibt an, dass der zweite Parameter
b
vor dem ersten Parameter
a
steht.
-
Der Rückgabewert 0 gibt an, dass die Sortierrangfolge der Elemente gleichwertig ist.
Die sortOn()-Methode (nur Array-Klasse)
Die
sortOn()
-Methode wird bei Array-Objekten mit Elementen eingesetzt, die Objekte enthalten. Diese Objekte müssen über mindestens eine gemeinsame Eigenschaft verfügen, die als Sortierschlüssel verwendet werden kann. Die Verwendung der
sortOn()
-Methode bei Arrays mit anderen Datentypen führt zu unerwarteten Ergebnissen.
Hinweis:
Die Vector-Klasse enthält keine
sortOn()
-Methode. Diese Methode ist nur für Array-Objekte verfügbar.
Im folgenden Beispiel wird das
poets
-Array so geändert, dass jedes Element ein Objekt und kein String ist. Jedes Objekt enthält den Nachnamen und das Geburtsjahr eines Dichters.
var poets:Array = new Array();
poets.push({name:"Angelou", born:"1928"});
poets.push({name:"Blake", born:"1757"});
poets.push({name:"cummings", born:"1894"});
poets.push({name:"Dante", born:"1265"});
poets.push({name:"Wang", born:"701"});
Mithilfe der
sortOn()
-Methode können Sie das Array nach der
born
-Eigenschaft sortieren. Mit der
sortOn()
-Methode werden die beiden Parameter
fieldName
und
options
definiert. Das
fieldName
-Argument muss als String angegeben werden. Im folgenden Beispiel wird
sortOn()
mit den beiden Argumenten
born
und
Array.NUMERIC
aufgerufen. Durch das
Array.NUMERIC
-Argument wird sichergestellt, dass die Sortierung numerisch und nicht alphabetisch durchgeführt wird. Dies empfiehlt sich auch, wenn die Zahlen die gleiche Anzahl an Ziffern aufweisen, da dadurch ein normaler Sortiervorgang durchgeführt werden kann, falls zu einem späteren Zeitpunkt eine Zahl mit mehr oder weniger Ziffern in das Array eingefügt wird.
poets.sortOn("born", Array.NUMERIC);
for (var i:int = 0; i < poets.length; ++i)
{
trace(poets[i].name, poets[i].born);
}
/* output:
Wang 701
Dante 1265
Blake 1757
cummings 1894
Angelou 1928
*/
Sortieren ohne Änderung des ursprünglichen Arrays (nur Array-Klasse)
Im Allgemeinen werden mit den Methoden
sort()
und
sortOn()
Änderungen an einem Array vorgenommen. Wenn Sie ein Array sortieren möchten, ohne Änderungen vorzunehmen, geben Sie die Konstante
Array.RETURNINDEXEDARRAY
als Teil des
options
-Parameters an. Dadurch wird ein neues Array mit der gewünschten Sortierung zurückgegeben und das ursprüngliche Array wird nicht geändert. Das zurückgegebene Array ist ein einfaches Array mit Indexnummern, die die neue Sortierreihenfolge angeben, und enthält keine Elemente des ursprünglichen Arrays. Wenn Sie das
poets
-Array ohne Änderungen nach Geburtsjahr sortieren möchten, geben Sie die Konstante
Array.RETURNINDEXEDARRAY
als Bestandteil des an den
options
-Parameter übergebenen Arguments an.
Im folgenden Beispiel werden die zurückgegebenen Indexinformationen in einem Array namens
indices
gespeichert. Dann werden über das
indices
-Array in Verbindung mit dem nicht geänderten
poets
-Array die Dichter nach dem entsprechenden Geburtsjahr sortiert ausgegeben:
var indices:Array;
indices = poets.sortOn("born", Array.NUMERIC | Array.RETURNINDEXEDARRAY);
for (var i:int = 0; i < indices.length; ++i)
{
var index:int = indices[i];
trace(poets[index].name, poets[index].born);
}
/* output:
Wang 701
Dante 1265
Blake 1757
cummings 1894
Angelou 1928
*/
Abfragen von Arrays
Mit vier Methoden der Array- und Vector-Klassen –
concat()
,
join()
,
slice()
und
toString()
– werden Daten im Array abgefragt, jedoch keine Änderungen am Array vorgenommen. Bei den Methoden
concat()
und
slice()
werden jeweils neue Arrays zurückgegeben, während bei den Methoden
join()
und
toString()
jeweils Strings zurückgegeben werden. Bei der
concat()
-Methode wird als Argument ein neues Array oder eine Liste mit Elementen mit dem vorhandenen Array verbunden, um ein neues Array zu erstellen. Die
slice()
-Methode verfügt über zwei Parameter mit den treffenden Bezeichnungen
startIndex
und
endIndex
und gibt ein neues Array zurück, das eine Kopie eines Teils der Elemente aus dem vorhandenen Array enthält. Der Teil beginnt mit dem Element bei
startIndex
und endet mit dem Element vor
endIndex
. Noch einmal zur Klarstellung: Das Element bei
endIndex
ist nicht Bestandteil des Rückgabewerts.
Im folgenden Beispiel werden mithilfe von
concat()
und
slice()
neue Arrays mit Elementen aus anderen Arrays erstellt:
var array1:Array = ["alpha", "beta"];
var array2:Array = array1.concat("gamma", "delta");
trace(array2); // output: alpha,beta,gamma,delta
var array3:Array = array1.concat(array2);
trace(array3); // output: alpha,beta,alpha,beta,gamma,delta
var array4:Array = array3.slice(2,5);
trace(array4); // output: alpha,beta,gamma
Mithilfe der Methoden
join()
und
toString()
können Sie ein Array abfragen und den entsprechenden Inhalt in einem String zurückgeben. Wenn bei der
join()
-Methode keine Parameter verwendet werden, sind beide Methoden identisch, d. h., sie geben einen String mit einer durch Kommas getrennten Liste aller Elemente im Array zurück. Im Gegensatz zur
toString()
-Methode kann bei der
join()
-Methode der
delimiter
-Parameter übergeben werden, über den Sie das Symbol auswählen können, das im zurückgegebenen String als Trennzeichen zwischen den einzelnen Elementen verwendet wird.
Im folgenden Beispiel wird ein Array namens
rivers
(Flüsse) erstellt, für das
join()
und
toString()
aufgerufen werden, um die Werte im Array als String zurückzugeben. Die
toString()
-Methode wird verwendet, damit durch Kommas getrennte Werte zurückgegeben werden (
riverCSV
). Die
join()
-Methode wird verwendet, damit Werte zurückgegeben werden, die durch
+
-Zeichen getrennt sind.
var rivers:Array = ["Nile", "Amazon", "Yangtze", "Mississippi"];
var riverCSV:String = rivers.toString();
trace(riverCSV); // output: Nile,Amazon,Yangtze,Mississippi
var riverPSV:String = rivers.join("+");
trace(riverPSV); // output: Nile+Amazon+Yangtze+Mississippi
Beachten Sie, dass verschachtelte Array- oder Vector-Instanzen bei der
join()
-Methode immer mit durch Kommas getrennten Werten zurückgegeben werden, unabhängig davon, welches Trennzeichen für die Hauptelemente im Array angegeben wird, wie im folgenden Beispiel gezeigt:
var nested:Array = ["b","c","d"];
var letters:Array = ["a",nested,"e"];
var joined:String = letters.join("+");
trace(joined); // output: a+b,c,d+e
|
|
|