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:
Personne: notion de personne définie par un nom, un
prénom et une civilité.
Numeros: liste de numéros de téléphone (un numéro est représenté par un String).
Annuaire: notion d'annuaire c'est à dire ensemble
d'associations <p,n> avec pÎPersonne et nÎNumero.
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.
Les méthodes suivantes seront réalisées: constructeur à partir d'un nom et prénom; constructeur à partir d'une civilité, d'un nom et d'un prénom; les différents accesseurs nécessaires, ...
égalité sur la base du nom et du prénom
fonction de hashCode (cf. class Object pour obtenir les spécifications de cette méthode),
fonction toString (exemple: "Monsieur Jean Martin"),
...
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)
Réaliser et
tester cette classe en choisissant successivement les classes LinkedList
et ArrayList comme implémentation de List. Quel est le meilleur
choix selon vous?
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)
On
utilisera l'interface Map comme
structure de donnée de l'annuaire.
Réaliser
et la classe Annuaire en
choisissant la classe HashMap comme implémentation de Map. Testez
votre classe: importez un petit annuaire préalablement saisi dans un fichier de
type texte , et notamment demandez l'affichage de l'annuaire.
Modifier
l'implémentation en choisissant la classe TreeMap. Quel problème cela
pose-t'il? Quelle doit être la propriété de la classe Personne?
Faites les
modifications nécessaires, refaites le test précédent et constatez les
modifications lors de l'affichage de l'annuaire.
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)
Quelle
interface choisir comme structure de donnée de la classe Annuaire pour
simplifier l'écriture de cette méthode? Quelle classe concrète pouvez-vous
choisir comme implémentation?
Réaliser
cette évolution et tester cette nouvelle méthode.
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.
Réalisez la
méthode spécifiée ci-dessous:
/**
* 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)
Proposez
une solution pour éviter les doublons dans la liste des numéros.