package Dico; /**La classe AbstractDictionary implémente l'interface Dictionary.
*Elle implémente les méthodes de l'interface Dictionary et introduit trois autres méthodes.
*La méthode newIndexOf est abstraite car elle est spécifique aux éventuelles sous-classes de AbstractDictionary.
*Les méthodes indexOf et size sont implémentées par défaut et pourront être redéfinies au besoin dans les éventuelles sous-classes de AbstractDictionary.*/ public abstract class AbstractDictionary implements Dictionary { /**Tableau contenant les clés du dictionnaire*/ protected Object[] tabCle; /**Tableau contenant les valeurs correpondant aux clés du dictionnaire*/ protected Object[] tabValeur; /**Taille des tableaux des clés et des valeurs*/ protected int tailleTab; /**Ce constructeur vide définit un objet AbstractDictionary.*/ public AbstractDictionary() {} /**Cette méthode renvoie le nombre de couples clé-valeur contenus dans le dictionnaire
*Elle parcours le tableau des clés jusqu'à trouver une case à NULL *@return Nombre d'éléments contenus dans le dictionnaire*/ protected int size() { int cpt = 0; int i = 0; while ( (i < tailleTab) && (tabCle[i] != null) ) { cpt++; i++; } return cpt; } /**Cette méthode renvoie l'index auquel est rangée la clé passée en paramètre dans le receveur
*Elle effectue une recherche séquentielle
*@param key clé recherchée dans le dictionnaire *@return index de la clé si elle a été trouvée, sinon -1*/ protected int indexOf(Object key) { int ind = 0; while ( (ind < tailleTab) && (tabCle[ind] != key) ) ind++; if (ind == tailleTab) return -1; else return ind; } /**Cette méthode renvoie l'index auquel sera rangé un nouveau couple clé-valeur dans le dictionnaire
*Cet index est calculé en fonction de la clé passée en paramètre
*Cette méthode ne doit être appelée que dans le cas ou le dictionnaire ne contient pas déjà cette clé
*S'il n'y a pas assez de place dans le dictionnaire pour l'insertion d'un nouvel élément, newIndexOf remplace les tableaux des clés et des valeurs pas des tableaux plus grands *@param key clé de l'élément à insérer *@return index du nouvel élément dans le receveur*/ abstract protected int newIndexOf(Object key); /**Cette méthode recherche un élément du dictionnaire *@param key clé de l'élément à rechercher *@return élément ou null si la clé est inconnue du receveur*/ public Object get(Object key) { int ind = indexOf(key); if (ind == -1) return null; else return tabValeur[ind]; } /**Cette méthode insère un nouveau couple clé-valeur dans le receveur, si la clé est inconnue dans le receveur *@param key clé de l'élément à insérer *@param value valeur de l'élément à insérer *@return receveur de la méthode*/ public Object put(Object key, Object value) { if (!containsKey(key)) { int i = newIndexOf(key); tabCle[i] = key; tabValeur[i] = value; } return this; } /**Cette méthode indique si le receveur est vide *@return vrai si le receveur est vide, faux sinon*/ public boolean isEmpty() { if (size() == 0) return true; else return false; } /**Cette méthode indique si une clé est connue dans le receveur *@param key clé à recherche *@return vrai si la clé a été trouvée, faux sinon*/ public boolean containsKey(Object key) { for (int i = 0 ; i < tailleTab ; i++) if (tabCle[i] == key) return true; return false; } public void affiche() { System.out.println("\n*************************************************************************"); System.out.println("Nombre de définitions : " + size()); System.out.println("Taille du dictionnaire : " + tailleTab); for (int i = 0 ; i < tailleTab ; i++) System.out.println("Index " + i + " : (" + tabCle[i] + " ; " + tabValeur[i] + ")"); System.out.println("*************************************************************************"); } /*Test d'insertion d'un élément dans le dictionnaire 1) CRITERES PRECONDITIONS: -dictionnaire vide (DV) / dictionnaire non vide (DNV) -élément dans dictionnaire (ED) / élément non dans dictionnaire (END) POSTCONDITION: -élément inséré (EI) / élément non inséré (ENI) 2) CLASSES D'EQUIVALENCE POTENTIELLES : (DV DNV) * (ED END) * (EI ENI) EFFECTIVES : DV*END*EI ; DNV*END*EI ; DNV*ED*ENI */ /*Test de recherche d'un élément dans le dictionnaire 1) CRITERES PRECONDITIONS: -dictionnaire vide (DV) / dictionnaire plein (DNV) POSTCONDITION: -élément trouvé (ET) / élément non trouvé (ENT) 2) CLASSES D'EQUIVALENCE POTENTIELLES : (DV DV) * (ET ENT) EFFECTIVES : DV*ENT ; DNV*ET ; DNV*ENT */ protected int testBoiteNoire() { int retour = 0; //TEST N°1: //Recherche : DV * ENT //Insertion : DV * END * EI System.out.println("\nTEST N°1:"); System.out.println("Recherche : Essai de recherche d'un élément dans un dictionnaire vide"); System.out.println("Insertion : Essai d'insertion d'un élément dans un dictionnaire vide"); if (this.isEmpty()) { if (this.containsKey("Platon")) { System.out.println("Erreur : Le dictionnaire est vide et ne peut donc pas contenir l'élément"); System.out.println("TEST 1 ..............................................................[FAILED]"); retour = -1; } else { if (this.get("Platon") != null) { System.out.println("Erreur : L'élément n'aurait pas du être trouvé"); System.out.println("TEST 1 Recherche ....................................................[FAILED]"); retour = -1; } else System.out.println("TEST 1 Recherche ....................................................[OK]"); this.put("Platon", "Philosophe grec"); if (this.containsKey("Platon")) System.out.println("TEST 1 Insertion ....................................................[OK]"); else { System.out.println("Erreur : L'élément n'a pas été inséré"); System.out.println("TEST 1 Insertion ....................................................[FAILED]"); retour = -1; } } } else { System.out.println("Erreur : Le dictionnaire devrait être vide"); System.out.println("TEST 1 ..............................................................[FAILED]"); retour = -1; } //TEST N°2: //Recherche : DNV * ENT //Insertion : DNV * END * EI System.out.println("\nTEST N°2 :"); System.out.println("Recherche : Essai de recherche d'un élément dans un dictionnaire non vide"); System.out.println("Insertion : Essai d'insertion d'un élément dans un dictionnaire non vide\nL'élément est inconnu du dictionnaire"); if (this.isEmpty()) { System.out.println("Erreur : Le dictionnaire ne devrait pas être vide"); System.out.println("TEST 2 ..............................................................[FAILED]"); retour = -1; } else { if (this.containsKey("Euclide")) { System.out.println("Erreur : Le dictionnaire ne devrait pas contenir l'élément"); System.out.println("TEST 2 ..............................................................[FAILED]"); retour = -1; } else { if (this.get("Euclide") != null) { System.out.println("Erreur : L'élément n'aurait pas du être trouvé"); System.out.println("TEST 2 Recherche ....................................................[FAILED]"); retour = -1; } else System.out.println("TEST 2 Recherche ....................................................[OK]"); this.put("Euclide", "Mathématicien grec"); if (this.containsKey("Euclide")) System.out.println("TEST 2 Insertion ....................................................[OK]"); else { System.out.println("Erreur : L'élément n'a pas été inséré"); System.out.println("TEST 2 Insertion ....................................................[FAILED]"); retour = -1; } } } //TEST N°3 : //Recherche : DNV * ET //Insertion : DNV * ED * ENI System.out.println("\nTEST N°3 :"); System.out.println("Recherche : Essai de recherche d'un élément dans un dictionnaire non vide"); System.out.println("Insertion : Essai d'insertion d'un élément dans un dictionnaire non vide\nL'élément est connu du dictionnaire"); if (this.isEmpty()) { System.out.println("Erreur : Le dictionnaire ne devrait pas être vide"); System.out.println("TEST 3 ..............................................................[FAILED]"); retour = -1; } else { if (this.containsKey("Platon")) { if ((String)this.get("Platon") != "Philosophe grec") { System.out.println("Erreur : L'élément aurait du être trouvé"); System.out.println("TEST 3 Recherche ....................................................[FAILED]"); retour = -1; } else System.out.println("TEST 3 ..............................................................[OK]"); } else { System.out.println("Erreur : Le dictionnaire devrait contenir l'élément"); System.out.println("TEST 3 ..............................................................[FAILED]"); retour = -1; } } return retour; } abstract protected int testBoiteBlanche(); public void test() { System.out.println("\n*************************************************************************"); System.out.println("TESTS BOITE NOIRE..."); if (testBoiteNoire() == 0) System.out.println("TESTS BOITE NOIRE ...................................................[OK]"); else System.out.println("TESTS BOITE NOIRE ...................................................[FAILED]"); System.out.println("*************************************************************************"); System.out.println("\n*************************************************************************"); System.out.println("TESTS BOITE BLANCHE ..."); if (testBoiteBlanche() == 0) System.out.println("TESTS BOITE BLANCHE .................................................[OK]"); else System.out.println("TESTS BOITE BLANCHE .................................................[FAILED]"); System.out.println("*************************************************************************"); } }