Indizierte Arrays

Flash Player 9 und höher, Adobe AIR 1.0 und höher

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