Les langages PHP et Javascript possèdent un seul objet pour représenter les tableaux dynamiques
(qui s'agrandissent tout seul) et les tables de hachage. Cette implantation change sa représentation
interne en fonction des appels qui sont effectués.
Avec l'exemple suivant
array = {}
array[0] = 'hello'
array[1] = 'world'
la représentation interne utilise un tableau avec un index sur le dernier élement
(comme
ArrayList en fait) pour être plus compacte en mémoire,
mais si le code suivant est ajouté
array[12006] = 'blah'
alors l'implantion change pour utiliser une table de hachage qui à 0 associe 'hello',
à 1 associe 'world' et à 12006 associe 'blah'.
On souhaite écrire une classe
DynamicArray qui utilise le même concept.
Pour simplifier l'implantation, la classe sera capable de changer son implantation interne
d'un tableau dynamique vers une table de hachage mais ne sera pas capable
de faire le chemin inverse.
Pour que l'implantation soit compacte, celle-ci possèdera seulement deux champs,
un champ
data qui à l'exécution contiendra soit un tableau d'objets
soit une table de hachage en fonction de la représentation courante et
un champs
top qui contiendra l'index du prochain élément à insérer
si aucun index n'est spécifié. On peut noter que dans le cas où
data
est un tableau,
top correspond aussi au nombre d'élements dans le tableau.
public class DynamicArray {
// as an array | as a map
private Object data; // array of objects | map of integer/object
private int top; // insertion index for push | insertion index for push
L'implantation de
DynamicArray devra être paramétrée par le type d'élement
et ne devra pas permettre de stocker
null.
Enfin, on ne vous demande pas de ré-implanter une table de hachage (même si cela
serait plus efficace en mémoire); utiliser une implantation déjà existante suffira
pourvu qu'elle conserve l'ordre d'insertion des élements.
Par contre, pour le tableau dynamique, on vous demande de ne pas utiliser
ArrayList
pour fournir une implantation plus compacte en mémoire, le tableau s'agrandira tout seul
si nécessaire en doublant sa taille.
Les tests JUnit sont dans la classe
DynamicArrayTest.java.