Ajout d'un élément comme ArrayDeque

Fermé
stampia02 Messages postés 95 Date d'inscription samedi 30 juillet 2011 Statut Membre Dernière intervention 13 mai 2017 - 18 févr. 2017 à 00:30
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 19 févr. 2017 à 21:45
Bonjour,

J'aimerai ajouter un élement dans une table du style ArrayDeque. Mais je n'arrive pas a respecter l'odre des éléments. J'ai même l'impression que le problème se situe au niveau de l'ajout de l'élément et non lors du dédoublement de la table (ou les deux).

Merci

   public void ajout(E element){ //KO
	   if (element == null) throw new IllegalArgumentException();
	    if (taille == table.length){
		   Object[] temp = new Object [table.length * 2];
		   //reorganise table
		   for (int i = tete; i < table.length; i++){
			   temp[i] = table[i];
		   }
		   for (int i = 0; i < tete; i++){
			   temp[i] = table[i];
		   }
		   table = temp;
	   }
	   table[(tete + taille)%table.length] = element; //indice après queue
	   taille++;
   }




1 réponse

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
18 févr. 2017 à 01:33
Bonjour,

Par définition un Deque doit pouvoir ajouter des valeurs par les deux bouts (au début et à la fin) dans quel cas es-tu ?

Sinon, je te conseillerais plutôt de manipuler une position de début de liste, ce sera plus utile que la taille pour faire tes calculs.

De plus, la portion de code concernant le dédoublement serait sûrement à sortir dans une méthode dédiée, parce qu'elle sera utilisé identiquement par les deux méthodes d'ajout.

Une approche pour faire ce genre de développements c'est le TDD.
Tu fais d'abords tes tests unitaires pour lister les différents cas possibles puis tu fais le code jusqu'à ce que tous tes tests fonctionnent.
Cette approche permet de mieux découper son code en méthode plus petites, donc plus facilement testables et surtout plus facilement codables.

Remarque : rien ne t'obliges à considérer null comme une valeur invalide.
0
stampia02 Messages postés 95 Date d'inscription samedi 30 juillet 2011 Statut Membre Dernière intervention 13 mai 2017 1
18 févr. 2017 à 11:55
Effectivement je dois pouvoir ajouter à la fin, mais également au début si il y a encore de la place dans ma table. (par exemple après la suppression d'un élément). Le but est de maximiser l'utilisation de méthode en O(1).

Je ne comprend pas trop ce que tu veux dire par "position de début de table", c'est l'indice tête, non ? Enfaite j'aurai aimé faire qu'une seul méthode d'ajout qui prend en compte le positionnement de début de table, même lors d'une suppression.

Voici mon code de suppresion

   public E suppresion(){
	 if (taille == 0) throw new IllegalArgumentException();
	   E elementARenvoyer = (E) table[tete];
	   taille--;
	   table[tete] = table[tete+1];
	   return elementARenvoyer;
   }


Pour le dédoublement je peux le faire a part oui. Intérrésant le TDD, je ne connaisait pas cette approche.
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
18 févr. 2017 à 16:18
"ce que tu veux dire par "position de début de table", c'est l'indice tête, non ?"
Tu n'as pas expliqué à quoi correspondait tes variables, alors j'essaye de deviner.
Pour moi il devrait y avoir deux pointeurs dans ton objet, l'indice dans le tableau où se situe le premier élément et l'indice dans le tableau où se situe le dernier élément.
Ajouter au début consiste donc à faire
first--; table[first]=e;
et ajout à la fin consiste à faire
last++; table[last]=e;
sous réserve bien sûr qu'il y ait assez de place dans la table. Et en mettant en place des index cycliques, c'est à dire que l'on pourrait avoir des éléments qui dépassent la taille du tableau en utilisant ses premières cases, mais je crois que tu es déjà parti avec ce principe.
0
stampia02 Messages postés 95 Date d'inscription samedi 30 juillet 2011 Statut Membre Dernière intervention 13 mai 2017 1
18 févr. 2017 à 17:05
"Et en mettant en place des index cycliques, c'est à dire que l'on pourrait avoir des éléments qui dépassent la taille du tableau en utilisant ses premières cases, mais je crois que tu es déjà parti avec ce principe."

C'est ce que j'ai essayé de faire avec le modulo.
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
18 févr. 2017 à 18:00
Dans l'augmentation de la taille du tableau, il faut déplacer les éléments de la fin en prenant en compte la nouvelle taille :
temp[table.length+i] = table[i];


if (taille == table.length){
    Object[] temp = new Object [table.length * 2];
    for (int i = 0; i < tete; i++){
        temp[i] = table[i];
    }
    for (int i = tete; i < table.length; i++){
        temp[table.length+i] = table[i];
    }
    table = temp;
}
0
stampia02 Messages postés 95 Date d'inscription samedi 30 juillet 2011 Statut Membre Dernière intervention 13 mai 2017 1
19 févr. 2017 à 21:00
D'accord je regarde à sa. Comment je peux accéder directement à un indice avec ArrayDeque? Je ne vois aucune méthode dans la doc Java qui permet de le faire ?
0