TD n°9 POO

Utilisation de l'API java.util (Structures de données)

 

Objectifs: Aborder au travers d'une application simple les structures de données de l'API JAVA ( Map, List, LinkedList, ArrayList, HashMap, TreeMap, Set ) et les itérateurs permettant leurs manipulations.

Classes fournies : annuaire.jar

Rendu: un fichier de compte-rendu format ascii ou html contenant les réponses aux questions posées dans le sujet.

 

1) Consultez les transparents sur les collections (10mn)

2) Travail sur machine

On souhaite réaliser des classes servant de base à une application de gestion d'un annuaire téléphonique. On définit pour cela 3 classes:

 

Pour cette application vous disposez des classes suivantes:

        ImportAnnuaire :  contient uniquement la méthode statique suivante

/**

 * retourne une Map contenant les associations Personne-Numero contenu dans le fichier texte

 * donné. Chaque ligne du fichier doit être de la forme :

 * Civilite Nom Prenom "Numero1" "Numero2" .... <CR> (Civilite = Mr ou Mme ou Melle)

 * le fichier doit se terminer à la fin de la dernière ligne (pas de <CR>)

 */

public static Map importFromFile(String file)

 

        TestAnnuaire  : offre une interface graphique avec les fonctionnalités de l'annuaire (cf. spécif de la classe Annuaire ci-dessous). Cette classe contient une méthode main et doit  être la racine de l'application.

 

2.1. Réalisation des classes Personne et Numeros

2.1.1. Classe Personne (15mn)

La classe Personne dispose de trois champs et, pour le codage de la civilité, des constantes de classe suivantes (déclarées public):   INCONNU=0, MR=1,  MME=2, MELLE=3. Attention cette classe est utilisée dans l'interface qui vous est fournie. Il s'en suit, qu'en l'absence de spécifications claires, vous devez assurer la conformité de la déclaration aux utilisations qui en sont faites.

 

 2.1.2. Classe Numeros (15mn)

On utilisera une List comme structure de donnée pour gérer les numéros. Invariant: un objet de type Numeros possède au moins un numéro de téléphone. Méthodes offertes par la classe Numeros :

 

/** Constructeur d'une liste à un seul numéro */

   public Numeros(String num)

/** ajoute un numéro à la liste */

  public void add(String num)

/** retourne le premier numéro de la liste (il existe forcément) */

  public String numero()

/** retourne true si la liste contient le numéro donné */

  public boolean has(String num)

/** retourne le nombre de numéros de la liste (>=1) */

  public int count()

/** retourne la séquence des numéros séparés par des virgules dans une chaîne */

  public String toString()

/** enlève le numéro donné de la liste. @require: count()>1 */

   public void remove(String num)

 

2.2. Réalisation de la classe Annuaire (30nm)

 

/** notion d'annuaire : ensemble d'associations Personne-Numero */

public class Annuaire {

/** constructeur d'annuaire vide */

   public Annuaire()

/**

 * ajoute une nouvelle entrée dans l'annuaire. Si p n'existe pas: on crée une nouvelle

 * association (p,n) ; sinon : on ajoute n aux numéros de p

 * Correspondance interface: BOUTON Ajouter

 */

   public void addEntry(Personne p, String n)

/**

 * chargement de l'annuaire depuis un fichier texte (le contenu de l'annuaire est remplacé)

 * chaque ligne du fichier est de la forme :

 * Civilite Nom Prenom "Numero1" "Numero2" .... <CR> (Civilite = Mr ou Mme ou Melle)

 * Correspondance interface: BOUTON Charger

 */

   public void loadEntryFromFile(String file)

/**

 * retourne le premier numéro de la personne, si la personne est absente retourne null

 * Correspondance interface: BOUTON Numéro

 */

   public String getNumber(Personne p)

/**

 * retourne les numéros de la personne, si la personne est absente retourne null

 * Correspondance interface: BOUTON Numéros

 */

   public String getNumbers(Personne p)

/**

 * retourne l'intégralité de l'annuaire dans un ordre quelconque : une personne par ligne

 * suivie de ses numéros de téléphone

 * Correspondance interface: BOUTON Print Répertoire

 */

   public String toString()

/**

 * retourne la première personne ayant le numero donné, null si aucune personne

 * Correspondance interface: BOUTON Personne

 */

   public Personne annuInverse(String num)

/**

 * supprime la personne de l'annuaire, si elle est présente

 * Correspondance interface: BOUTON Supprimer (si le champ "numero" est vide)

 */

   public void remove(Personne p)

/**

 * supprime le numero donné de la personne, s'il n'y a plus qu'un numéro dans la liste supprime la personne

 * Correspondance interface: BOUTON Supprimer (si le champ "numero" est rempli)

 */

   public void remove(Personne p,String num)

 

2.3. Evolution de la classe Annuaire (+10mn)

2.3.1 On veut ajouter la méthode suivante à l'annuaire:

 

/**

 * retourne la liste des personnes dont le nom commence par la lettre donnée (minuscule ou majuscule)

 * (une personne par ligne, avec ses numéros)

 */

   public String toString(char c)

 

2.3.2. On veut pouvoir ajouter à l'annuaire des entrées fournies dans un fichier avec la logique suivante: si la personne existe déjà dans la table, on ajoute les numéros à ceux existant, sinon on ajoute l'entrée correspondante dans l'annuaire.

 

/**

 * ajout des entrées contenues dans un fichier texte chaque ligne du fichier est de la forme :

 * Civilite Nom Prenom "Numero1" "Numero2" .... <CR> (Civilite = Mr ou Mme ou Melle)

 * Correspondance interface: BOUTON Importer

 */

   public void addEntryFromFile(String file)