Créer et utiliser les tableaux de données, "Array", en ActionScript 3 (AS3)
Un tableau est une strucutre de données pouvant contenir plusieurs valeurs individuelles, de même qu'une étagère est une structure physique comprenant plusieurs compartiments. Contrairement à une variable, le tableau peut contenir plusieurs valeurs.
La classe ActionScript utilisée est la classe Array. On peut représenter les tableaux comme une liste verticale de données placées dans la mémoire du Flash Player. En prenant un exemple de la vie courante, on peut imaginer stocker dans un tableau, la liste de toutes les agences d'une banque.
La visualisation du tableau pourrait être celle-ci :
Agence d'Angers
Agence de Bordeaux
Agence de Cahors
Agence de Lens
Agence de Paris
Agence de Nantes
Agence de Rennes
Création de tableaux
On peut créer un tableau vide et l'alimenter par la suite ou créer et alimenter le tableau en même temps
-
var tableau1:Array = new Array(); //le tableau créé est vide
-
var tableau2:Array = new Array("Agence d'Angers", "Agence de Bordeaux", "Agence de Cahors", "Agence de Lens", "Agence de Paris", "Agence de Nantes", "Agence de Rennes"); //le tableau est créé et alimenté.
Ajout d'éléments à la fin du tableau
On peut ajouter des éléments à la fin d'un tableau grâce à la méthode push() de la classe Array
-
tableau1.push(2008); //La valeur numérique 2008 est ajouté à la fin du tableau
Accès aux éléments d'un tableau
Nous allons utiliser une boucle pour parcourir le tableau en ordre croissant
Nous allons indiquer à notre boucle la valeur initiale, l'index 0, ainsi que sa limite de valeurs : la longueur du tableau.
-
trace("***********************Tableau 1 après un ajout à la fin du tableau");
-
for(var i:uint=0; i <tableau1.length ; i++)
-
{
-
trace("Elément " + i + " du tableau 1: " + tableau1[i]); //l'opérateur d'accès au tableau est []
-
}
Il est cependant préférable d'utiliser une variable pour stocker la longueur du tableau afin de ne pas recalculer la longueur à chaque itération. (Merci NikO)
-
trace("***********************Tableau 1 après un ajout à la fin du tableau");
-
var longueurTableau:uint = tableau1.length;
-
for(var b:uint=0; b <longueurTableau ; b++)
-
{
-
trace("Elément " + b+ " du tableau 1: " + tableau1[b]); //l'opérateur d'accès au tableau est []
-
}
Ajout de plusieurs éléments à la fin du tableau
-
tableau1.push(2009, 2014, 2015); //Il est tout à fait possible d'ajouter plusieurs éléments grâce à la méthode push.
-
trace("***********************Tableau 1 après plusieurs ajouts en fin de tableau");
-
for(var g:uint=0; g <tableau1.length ; g++)
-
{
-
trace("Elément " + g + " du tableau 1: " + tableau1[g]); //l'opérateur d'accès au tableau est []
-
}
Ajout d'éléments au début du tableau
On peut ajouter des éléments au début d'un tableau grâce à la méthode unshift() de la classe Array
-
tableau1.unshift(2007);//La valeur numérique 2007 est ajouté au début du tableau
-
trace("***********************Tableau 1 après un ajout au début du tableau");
-
for(var h:uint=0; h <tableau1.length ; h++)
-
{
-
trace("Elément " + h + " du tableau 1: " + tableau1[h]); //l'opérateur d'accès au tableau est []
-
}
On peut aussi ajouter des éléments à un endroit précis du tableau
On peut ajouter des éléments à un index désiré en utilisant la méthode splice() de la classe Array
-
tableau1.splice(3, 0, 2010, 2011, 2012, 2013);//ajoute 4 valeurs(2010, 2011, 2012, 2013) à partir de l'index 3. La méthode splice() est aussi utilisée pour supprimer des données, c'est pourquoi on précise 0 en 2ème paramètre pour indiquer que l'on ne supprime rien
-
trace("***********************Tableau 1 après un ajout au mileu du tableau");
-
for(var e:uint=0; e <tableau1.length ; e++)
-
{
-
trace("Elément " + e + " du tableau 1: " + tableau1[e]); //l'opérateur d'accès au tableau est []
-
}
Supprimer des éléments du tableau
On peut supprimer des éléments au début ou la fin d'un tableau en utilisant les méthodes shift() ou pop() de la classe Array
-
trace("***********************Tableau 2 complet");
-
for(var j:uint=0; j <tableau2.length ; j++)
-
{
-
trace("Elément " + j + " du tableau 2: " + tableau2[j]); //l'opérateur d'accès au tableau est []
-
}
-
tableau2.shift();//Supprime le premier élément du tableau soit la valeur "Agence d'Angers" pour le tableau 2
-
tableau2.pop();//Supprime le dernier élément du tableau soit la valeur "Agence de Rennes" pour le tableau 2
-
trace("***********************Tableau 2 avec Angers et Rennes qui ont été supprimés");
-
for(var k:uint=0; k <tableau2.length ; k++)
-
{
-
trace("Elément " + k + " du tableau 2: " + tableau2[k]);
-
}
-
//les valeurs Angers et Rennes ont été supprimées
On peut aussi supprimer des éléments à un endroit précis du tableau
On utilise la méthode splice() en précisant 2 paramètres, l'index de début de suppression et le nombre d'éléments à supprimer
-
tableau2.splice(2,1);//Supprime la valeur qui est à l'index 2 soit "Agence de Lens"
-
trace("***********************Tableau 2 avec l'Agence de Lens supprimée");
-
for(var l:uint=0; l <tableau2.length ; l++)
-
{
-
trace("Elément " + l + " du tableau 2: " + tableau2[l]);
-
}
-
tableau2.splice(1,2);//Supprime 2 valeurs à partir de l'index 1 soit "Agence de Cahors et Agence de Paris"
-
trace("***********************Tableau 2 avec Cahors et Paris qui ont été supprimés");
-
for(var m:uint=0; m <tableau2.length ; m++)
-
{
-
trace("Elément " + m + " du tableau 2: " + tableau2[m]);
-
}
;)
Je suis Antony Chauviré, développeur sur la Flash Platform.
Salut,
Il vaut mieux eviter les
for (var i : int = 0;i<array.length ...
Car à chaque iteration il y a recalcul de la longueur du tableau, fait quelques benchs, tu verras :)
NikO : en effet, il vaut mieux stocker la longueur du tableau dans une variable cependant comme cet article est destiné dans un premier temps à des débutants, j'ai préféré ne pas le faire afin de ne pas les perturber. Je vais tout de même modifier l'article pour le préciser. ;)
en AS j'utilisait le for ... in ...
plus simple, et tu economises une variable. Par contre, si mes souvenirs sont bons, cette méthode attaque par la fin du tableau.
Maintenant, à vérifier si les benchs sont bons ou pas.
Salut,
J'aurais aime savoir la difference qu'il y a au moment de la declaration entre:
mon_array = new Array("Dijon","grenoble");
et
var tableau2:Array = new Array("Dijon","grenoble");
Ah, je vois que tu as deja ecrit un billet la dessus.
http://www.bases-as3.fr/index.ph...
bonjour et merci beaucoup pour ces tutos pour débutant comme moi,
J'ai copié le code pour voir, et j'ai toujours les erreurs
"1084: Erreur de syntaxe : rightparen est attendu devant semicolon."
à cette ligne là
for(var i:uint=0; i <tableau1.length ; i++)
ou celle là
for(var b:uint=0; b <longueurTableau ; b++)
... par exemple
?
merci de me dire pourquoi
Bonne journée Dominique
je pense avoir trouvé , ça marche comme ça :
for (var i:uint = 0; i < tableau2.length; i++)
Bonne JOurnée
Bonjour Dominique,
Il y a une erreur d'affichage dans le code proposer dans l'article, en effet l'opérateur < est transformé.
Vérifies bien que tu utilises < et non le code transformé
;)
Salut,
quand tu dis:
Il est cependant préférable d'utiliser une variable pour stocker la longueur du tableau afin de ne pas recalculer la longueur à chaque itération.
C'est pas vraiment vrai car length est une propriété et non une fonction alors c'est juste une lecture, pas de calcul. C'est donc plus rapide de ne pas stocker dans une variable vu que ça fait une instruction en plus non?
Salut firstfantasy
Plutôt que de long discours, je te propose de tester ce petit script :
;)
Bonjour,
Je chercher= à mélanger de manière alétoire le contenu de mon tableau à chauq epassage, mais ça ne marche... Je ne trouve d'exemple nul part. Peut être vous une piste à me donner?
Mon code :
for (var i:int=0; i<=19; i++) {
listePieces.push(i);
trace ("listePieces =" + listePieces);
var piecesSupprimesListe:Array=listePieces.splice(0,1);
trace ("piecesSupprimesListe ="+piecesSupprimesListe);
listePiecesMelanges.push(Math.ceil(Math.random(piecesSupprimesListe)));
trace ("listePiecesMelanges ="+listePiecesMelanges);
}
Trop surpris j'en reste le cul par terre , j'étais persuadé que le compilateur faisait une optimisation ...
Pour voir si c'étais la même chose en java j'ai repris ton code pour tester , mais je suis obligé de faire une concatenation sinon compile pas sous netbeans.
En java :
String[] tab = new String[1000000];
StringBuilder test = new StringBuilder();
for(int i=0;i<tab.length;i++)
{
tab[i] = "valeur" + i;
}
long firstTime = System.currentTimeMillis();
for(int j=0;j<tab.length;j++)
{
test.append(tab[j]);
}
long secondTime = System.currentTimeMillis();
System.out.println("Durée d'exécution avec l'utilisation de tab.length dans la boucle : "
+ (secondTime - firstTime));
test = new StringBuilder();
int tabLength = tab.length;
long thirdTime = System.currentTimeMillis();
for(int k=0;k<tabLength;k++)
{
test.append(tab[k]);
}
long fourthTime = System.currentTimeMillis();
System.out.println("Durée d'exécution avec l'utilisation d'une variable dans la boucle : "
+ (fourthTime - thirdTime));
Durée d'exécution avec l'utilisation de tab.length dans la boucle : 289
Durée d'exécution avec l'utilisation d'une variable dans la boucle : 124
En as3 avec la concatenation:
var tab:Array = [];
for(var i:int=0;i<1000000;i++)
{
tab[i] = "valeur" + i;
}
var test:String ="";
var firstTime:Number = getTimer();
for(var j:int=0;j<tab.length;j++)
{
test += tab[j];
}
var secondTime:Number = getTimer();
trace("Durée d'exécution avec l'utilisation de tab.length dans la boucle : "
+ (secondTime - firstTime));
var tabLength:int = tab.length;
test = "";
var thirdTime:Number = getTimer();
for(var k:int=0;k<tabLength;k++)
{
test += tab[k];
}
var fourthTime:Number = getTimer();
trace("Durée d'exécution avec l'utilisation d'une variable dans la boucle : "
+ (fourthTime - thirdTime));
Durée d'exécution avec l'utilisation de tab.length dans la boucle : 897
Durée d'exécution avec l'utilisation d'une variable dans la boucle : 626
bonsoir,et merci pour la clarté générale de tes pages AS3.
juste une petite question.
Ne pourrais-tu ps aussi introduire la notion d'événement à un tableau, pour compléter tes descriptions, comme par exemple:
tablo[indice].addEventListener(CetEvenement,LafonctionAssociee); ?
merci