Forums Développement Multimédia

Les formations Mediabox
Les formations Mediabox

La classe Vector : un tableau d'éléments de même type

Compatible ActionScript 3. Cliquer pour en savoir plus sur les compatibilités.Par tannoy (Antony Chauviré), le 04 mars 2010

Introduction

La classe Vector vous permet d'accéder à un vecteur et de le manipuler; un vecteur est un tableau dont les éléments possèdent tous le même type de données.

Le type de données des éléments d'un vecteur est appelé le type de base. Le type de base peut correspondre à n'importe quelle classe ou interface.

La classe Vector n'est disponible que depuis le Flash Player 10. Il faut le spécifier au compilateur, sinon l'utilisation de cette classe génère une erreur. lilive - 15/03/2010
Vous trouverez ici deux exemples pratiques d'utilisation de la classe Vector.
lilive - 11/05/2010

Création d'une occurrence de Vector

Le type de base est spécifié lorsque vous déclarez la variable d'un vecteur. La syntaxe utilisée est Vector.<T>T représente le type de base.

var trimestre:Vector.<String>;

Le type de base est aussi spécifié lors de l'appel au constructeur Vector.<T>()

var trimestre:Vector.<String>;
trimestre = new Vector.<String>();

Un vecteur peut posséder une longueur fixe et donc avoir un nombre d'éléments invariables. Le constructeur de la classe Vector possède deux arguments optionnels : la longueur initiale du vecteur dont la valeur par défaut est 0 et un booléen indiquant si cette longueur est fixe, dont la valeur par défaut est false.

var trimestre:Vector.<String>;
trimestre = new Vector.<String>(4, true);

Manipuler un vector

La manipulation d'un vecteur se fait en utilisant l'opérateur d'accès au tableau ([]) mais aussi en utilisant des méthodes identiques à la classe Array. Parmi ces méthodes, on retrouve : push(), pop(), shift(), unshift().

L'opérateur d'accès au tableau ([])

Il permet de définir ou de récupérer une valeur du vecteur.

var trimestre:Vector.<String>;
trimestre = new Vector.<String>(4, true);
trimestre[0] = "Janvier-Mars";
trimestre[1] = "Avril-Juin";
trimestre[2] = "Juillet-Septembre";
trimestre[3] = "Octobre-Décembre";
trace("1ère ligne du tableau : " + trimestre[0]);//1ère ligne du tableau : Janvier-Mars
trace(trimestre);//Janvier-Mars,Avril-Juin,Juillet-Septembre,Octobre-Décembre

La méthode push()

La méthode push() ajoute un ou plusieurs éléments à la fin d'un vecteur.

var mois:Vector.<String>;
mois = new Vector.<String>();
mois.push("Janvier", "Février", "Mars", "Avril");
trace(mois);

Cette méthode renvoie la nouvelle longueur du vecteur.

var mois:Vector.<String>;
mois = new Vector.<String>();
trace("Nombre d'éléments dans le vecteur avant l'ajout : " + mois.length);
var nbElementsApresAjout:int = mois.push("Janvier", "Février", "Mars", "Avril");
trace("Nombre d'éléments dans le vecteur après l'ajout : " + nbElementsApresAjout);

La méthode unshift()

La méthode unshift() ajoute un ou plusieurs éléments au début d'un vecteur et renvoie la nouvelle longueur du vecteur. Les autres éléments du vecteur sont décalés de leur position d'origine, n, vers n + le nombre de nouveaux éléments.

var duree:Vector.<int> = new Vector.<int>();
var nbDuree:int = duree.push(15, 20, 25);
trace("Nombre d'éléments dans le vecteur après l'ajout : " + nbDuree);
nbDuree = duree.unshift(5, 10);
trace("Nombre d'éléments dans le vecteur après l'ajout : " + nbDuree);
trace(duree);

Bug pour les types String et Object (en date du 26/03/2009)

Avec un vecteur de type String ou Object, la méthode unshift() ajoute les éléments mais supprime un nombre identique d'éléments depuis la fin du vecteur.

var mois:Vector.<String>;
mois = new Vector.<String>();
trace("Nombre d'éléments dans le vecteur avant l'ajout : " + mois.length);
var nbElements:int = mois.push("Mars", "Avril", "Mai", "Juin");
trace("Nombre d'éléments dans le vecteur après l'ajout : " + nbElements);
nbElements = mois.unshift("Janvier", "Février");
trace("Nombre d'éléments dans le vecteur après l'ajout : " + nbElements);
trace(mois);

Le bug est connu et répertorié : http://bugs.adobe.com/jira/browse/ASC-3620

La méthode pop()

La méthode pop() supprime le dernier élément du vecteur et renvoie cet élément. La propriété length du vecteur est diminuée d'une unité lorsque cette fonction est appelée.

var mois:Vector.<String>;
mois = new Vector.<String>();
trace("Nombre d'éléments dans le vecteur avant l'ajout : " + mois.length);
var nbElements:int = mois.push("Janvier", "Février", "Mars", "Avril");
trace("Nombre d'éléments dans le vecteur après l'ajout : " + nbElements);
var elementSupprime:String = mois.pop();
trace(elementSupprime + " a été supprimé du vecteur");
trace("Nombre d'éléments dans le vecteur après la suppression : " + mois.length);

La méthode shift()

La méthode shift() supprime le premier élément du vecteur et renvoie cet élément. Les éléments restants du vecteur sont décalés de leur position d'origine, n, vers n -1.

var mois:Vector.<String>;
mois = new Vector.<String>();
trace("Nombre d'éléments dans le vecteur avant l'ajout : " + mois.length);
var nbElements:int = mois.push("Janvier", "Février", "Mars", "Avril");
trace("Nombre d'éléments dans le vecteur après l'ajout : " + nbElements);
trace("Le premier élément avant la suppression est " + mois[0]);
var elementSupprime:String = mois.shift();
trace(elementSupprime + " a été supprimé du vecteur");
trace("Le premier élément après la suppression est " + mois[0]);

La méthode splice()

La méthode splice() Ajoute et supprime des éléments dans un vecteur. Cette méthode modifie le vecteur sans faire de copie. 

Suppression d'éléments

splice(startIndex, deleteCount);

Cette méthode permet de supprimer des éléments à partir d'un index du vecteur. Le premier paramètre de la méthode correspond à l'index de départ, le deuxième paramètre correspond au nombre d'éléments à supprimer. Ce nombre inclut l'élément spécifié dans le paramètre startIndex

var mois:Vector.<String>;
mois = new Vector.<String>();
trace("Nombre d'éléments dans le vecteur avant l'ajout : " + mois.length);
var nbElements:int = mois.push("Janvier", "Février", "Mars", "Avril", "Mai", "Juin");
trace(mois)
/*Suppression de Avril et Mai
Avril a pour index : 3*/
mois.splice(3, 2);
trace(mois);

Ajout d'éléments

splice(startIndex, deleteCount, items);

Lors de l'ajout d'éléments, le paramètre startIndex indique la position à partir de laquelle l'insertion doit avoir lieu. Le paramètre deleteCount est défini avec une valeur à 0 afin de ne supprimer aucun élement. Le paramètre items représente une liste d'une ou de plusieurs valeurs séparées par une virgule.

var mois:Vector.<String>;
mois = new Vector.<String>();
trace("Nombre d'éléments dans le vecteur avant l'ajout : " + mois.length);
var nbElements:int = mois.push("Janvier", "Février", "Mai", "Juin");
trace(mois)
mois.splice(2, 0, "Mars", "Avril");
trace(mois);

Ajout et suppression d'éléments

var mois:Vector.<String>;
mois = new Vector.<String>();
mois.push("Janvier", "Février", "Mars", "Juin", "Juillet", "Août");
trace(mois);
mois.splice(3, 2, "Avril", "Mai");
trace(mois);

Les méthodes d'itérations de la classe Vector

La classe Vector tout comme la classe Array possèdes des méthodes d'itérations. Ce sont des méthodes qui vont exécuter une fonction sur chaque éléments du vecteur.

La fonction exécutée lors de l'itération possède la signature suivante :

function myFunction(item:T, index:int, vector:Vector.<T>)

L'argument item correspond à l'élément du vecteur en cours d'itération, index correspond à l'index de l'élément et vector correspond au vecteur sur lequel l'itération est réalisée

La méthode every()

La méthode every() permet de tester tous les éléments du vecteur en fonction par exemple d'un critère de comparaison. Cette fonction renvoie true si tous les éléments répondent au critère, sinon elle s'arrête et renvoie false dès qu'un élément ne correspond pas au critère.

Cette fonction permet par exemple de déterminer si toutes les valeurs numériques d'un vecteur sont inférieures à une valeur ou bien si tous les mots d'un vecteur possèdent 3 caractères.

var numbers:Vector.<int> = new Vector.<int>();
numbers.push(0, 5, 10, 15, 20 , 25);
var isLessThanThirty:Boolean = numbers.every(lessThanThirty);
trace(isLessThanThirty);//trace true
var ndd:Vector.<String> = new Vector.<String>();
ndd.push("com", "net", "fr", "org");
var isThreeLetters:Boolean = ndd.every(threeLetters);
trace(isThreeLetters);//trace false
 
private function lessThanThirty(item:int, index:int, vector:Vector.<int>):Boolean
{
	return item < 30;
}
 
private function threeLetters(item:String, index:int, vector:Vector.<String>):Boolean
{
	return item.length == 3 ? true : false;
}

La méthode filter()

La méthode filter() permet de filtrer les éléments d'un vecteur. Elle retourne un nouveau vecteur contenant les éléments du vecteur initial répondant au critère du filtre.

var twoLetters:Vector.<String> = ndd.filter(twoLetters);
trace(twoLetters.length);//trace 1
private function twoLetters(item:String, index:int, vector:Vector.<String>):Boolean
{
	return item.length == 2 ? true : false;
}

La méthode forEach()

La méthode forEach() exécute une fonction sur chaque élément du vecteur. Elle revient à faire une boucle for Each sur le vecteur.

Cette méthode ne doit pas retourner de valeur.

var ndd:Vector.<String> = new Vector.<String>();
ndd.push("com", "net", "fr", "org");
ndd.forEach(upperCase);
 
private function upperCase(item:String, index:int, vector:Vector.<String>):void
{
	trace(item.toUpperCase());
}

La méthode map()

La méthode map() exécute une fonction de traitement sur chaque élément du vecteur. Elle retourne un vecteur contenant les éléments traitées par la fonction. Le vecteur retourné possède le même type de base et le même nombre d'éléments que le vecteur intial.

var prices:Vector.<Number> = new Vector.<Number>();
prices.push(99.00, 199.99, 100.00, 159.90);
var pricesTTC:Vector.<Number> = prices.map(priceTTC);
pricesTTC.forEach(showPriceTTC);
 
private function priceTTC(item:Number, index:int, vector:Vector.<Number>):Number
{
	return item * 0.196;
}
 
private function showPriceTTC(item:Number, index:int, vector:Vector.<Number>):void
{
	trace(item);
}

Les erreurs associées à la classe Vector

L'erreur TypeError

Cette erreur est générée si un argument n'est pas une occurrence du type de base du vecteur.

Avec l'opérateur d'accès au tableau [], l'erreur est générée à la compilation.

var mois:Vector.<String>;
mois = new Vector.<String>();
mois[0] = 12;

Avec la méthode push(), cette erreur est générée à l'exécution.

var mois:Vector.<Sprite>;
mois = new Vector.<Sprite>();
mois.push("Janvier");
trace(mois);

L'erreur RangeError

Un vecteur est un tableau dense. Contrairement à un tableau, qui peut posséder des valeurs dans les index 0 et 7 même s'il n'existe aucune valeur dans les positions 1 à 6, un vecteur doit posséder une valeur (ou la valeur null) dans chaque index.

Cette erreur sera générée si vous essayez d'insérer une valeur dans un index en dehors des limites.

var mois:Vector.<String>;
mois = new Vector.<String>();
mois[0] = "Janvier";
mois[1] = "Février";
mois[5] = "Mars";
trace(mois);

Si vous avez défini un vecteur de taille fixe, cette erreur sera générée en utilisant les méthodes push(), shift(), unshift().

var mois:Vector.<String>;
mois = new Vector.<String>(4, true);
mois.push("Janvier");
trace(mois);

Gestion des performances

Lors de l'ajout d'une seule valeur à la fois, l'opérateur d'accès au tableau [] se montre plus rapide que la méthode push().

var v1:Vector.<String>;
v1 = new Vector.<String>();
var time1:int = getTimer();
for(var i:int = 0; i<1000000; i++)
{
        v1[i] = "i=" + i;
}
var time2:int = getTimer();
trace("Temps d'exécution en millisecondes avec [] : " + (time2 - time1));
var v2:Vector.<String>;
v2 = new Vector.<String>();
var time3:int = getTimer();
for(var j:int = 0; j<1000000; j++)
{
        v2.push("j=" + j);
}
var time4:int = getTimer();
trace("Temps d'exécution en millisecondes avec push() : " + (time4 – time3));

Conclusion

Dans tous les cas où vous utilisez un objet Array dont tous les éléments possèdent le même type de données, il est préférable d'utiliser une occurrence de l'objet Vector.

En savoir plus