Strucutures de données : Grid et HashTable
Par -Alexandre LEGOUT aka LAlex- le samedi, octobre 9 2004, 14:04 - AS2 - Lien permanent
J'entame un petit package 'data' qui contiendra différentes structures de données parfois bien utiles. L'idée m'est venue du besoin d'une HashTable, que j'avais eu l'occasion de manipuler durant mes quelques aventures avec Java. J'en ai ainsi profité pour refaire la classe Grid que vous connaissez déjà peut-être ...
Pour ceux qui n'ont pas la chance de la connaitre, la classe HashTable correspond à l'utilisation d'un tableau, sauf que les clés n'ont pas de contrainte et peuvent être de n'importe quel type, contrairement au tableau qui a besoin de clés numériques, ou au tableau associatif qui a besoin de clés alphanumériques. Il s'agit donc d'un "simple" système d'association clés/valeurs.
import com.lalex.data.*;
La classe Grid, quant à elle, est un simple tableau à deux dimensions, agrémenté de quelques méthodes assez pratiques.
var ht:HashTable = new HashTable();
var k1 = new Date();
var k2 = ["un", "tableau", "comme", "clé"];
ht.put("clé", "valeur");
ht.put(k1, "date");
ht.put(k2, ["un", "tableau", "comme", "valeur"]);
trace(ht);
/** Sortie
[ clé => valeur
Sat Oct 9 14:14:53 GMT+0200 2004 => date
un,tableau,comme,clé => un,tableau,comme,valeur ]
*/
// Récupère un élément
trace("k2 : " + ht.get(k2));
/** Sortie
k2 : un,tableau,comme,valeur
*/
// Supprime un élément
ht.remove(k2);
trace(ht);
/** Sortie
[ clé => valeur
Sat Oct 9 14:14:53 GMT+0200 2004 => date ]
*/![]()
import com.lalex.data.*;
var gr:Grid = new Grid(2,3);
gr.fill(1,2,3,4,5,6);
trace(gr);
/** Sortie
[[1 , 2]
[3 , 4]
[5 , 6]]
*/
// Inverse la grille
gr.reverse();
trace(gr);
/** Sortie
[[1 , 3 , 5]
[2 , 4 , 6]]
*/
// Met tous les éléments de la grille au carré
gr.map(function(n) { return n*n; });
trace(gr);
/** Sortie
[[1 , 9 , 25]
[4 , 16 , 36]]
*/
Commentaires
Pas mal en effet, il y en a d'autres des classes comme ca en java que l'on pourrait retranscrire en AS2 ??
Moi je suis partant pour donner un coup de main si ca te tente
Il y en a surement d'autres qui seraient bien utiles, mais mes développements sont souvent guidés par le besoin, et tant que je n'ai pas besoin d'autres structures de données, je ne vais pas en faire "pour le plaisir" si elles n'ont pas une utilité concrète pour moi ...
++ ^^
Mmmm, vraiment bien ça! J'adopte à l'instant! Merci de partager!
Un petit truc que je vois dans la grid qui pourrait être utile. Mais peut-être que je me trompe sur le but du Grid et que cela serait un mauvais usage. La hauteur et largeur semblent toujours devoir être définies à l'avance. Ne serait-il pas utile de pouvoir faire un tableau de (exemple) 3 colonnes avec un nombre variable de rangées ? Avec une méthode, addRow ? Dans ce que je vois il semble requis de connaitre la hauteur, incrémenter celle-ci de 1 avec resizeTo et y ajouter les nouvelles valeurs.
)
À moins que cela soit possible en utilisant les méthode d'Array, puisque tu en hérites. Je devine que pour obtenir les valeurs d'une rangée, on peut utilise gr[x] comme pour un Array. Mais je vois que si on utilise une méthode comme "push", les propriétés _height et _width ne suivront pas.
Pas de méthode pour obtenir les valeurs d'une colonne ? (pas vraiment utile je crois, je demande juste comme ça
Aussi, si ça ne te dérange pas, je vais m'en faire une copie en retirant l'utilisation d'Error, non supporté par le player 6 qu'il m'arrive encore fréquemment de devoir cibler.
Enfin, je suis moins sûr pour la Grid, mais j'adore vraiment la HashTable pour laquelle je vois plusieurs cas dans mes projets où elle m'aurait été utile! Merci!
Tiens ... je vais voir si on peut changer dynamiquement la valeur des lignes dans la classe de lalex en trafiquant la propriété length de Array .. merci pour l'idée Steph



Sinon merci lalex ta classe Grid va me servir je pense dans pas longtemps
Me reste à voir un peu ta classe hashTable
bye
tiens lol moi j'avais fait la mm chose que Grid mais je l'avais nommé Map LoL bon ben on va changer de nom
Une instance de Grid peut bien évidemment être accédée comme un tableau :
var gr:Grid = new Grid(2,3);gr[1][2] = "Cell value";
@stef > Cette classe a été l'une de mes première en AS2, j'ai donc voulu utiliser les throw, mais en effet ce n'est peut-être pas nécessaire pour une compatibilité player 6 : je vais enlever ca.
Concernant les propriétés _width et _height, ca vient d'un désir d'optimisation. Et puis théoriquement, pour bien faire, il ne faudrait pas utiliser les méthodes d'Array. Je songe d'ailleurs à les surcharger avec des méthodes privées.
L'héritage d'Array est motivé par la volonté de l'accés avec les crochets (comme plus haut), mais l'idéal serait d'utiliser uniquement les méthodes setCell() et getCell(), avec un tableau en propriété privée ... et pourquoi pas de créer une interface pour cela !
Evidemment, si vous voyez des fonctionnalités intéressantes à rajouter à cette classe, je suis toujours preneur !
L'idéal aurait d'ailleurs été de pouvoir surcharger (ou créer) l'opérateur crochets ... peut-être en AS3 ?
faudrait l'ajouter sur la liste de petpex
@eka > Qui sait ? Peut-être a-til ses équivalents dans son package data ?
ah aussi
non là je parlais surtout de mettre sur la liste du prochain flash les crochets .. je ne sais pas si tu l'avais mi dans ta liste sur son blog 
Salut,
@LAlex : sur le système similaire que j'ai implémenté, j'ai 2-3 fonctions intéressantes, peut-etre pas utiles directement mais dans le cadre de mon mapEditor basé sur un Grid elles sont vraiment cool :
- reverse (bon tu l'a déjà fait ^^)
- turnLeft (quart de tour à gauche)
- turnRight (quart de tour à droite)
- switchRows (inverser 2 lignes)
- switchCols (inverser 2 colonnes)
voila peut-etre cela te donnera des idées
pour l'histoire de surcharger les crochets, je verrai bien les déclaration de matrice à la java-like tu genre int[][] = new int[6][7]; Ce serait l'idéal ^^ (donc tu peux rajouter des dimensions comme tu veux :)) et ca t'évite de faire un if lorsque tu parcours la matrice ou que tu l'initilise
@++
Fil des commentaires de ce billet