TP11

API collection


Objectifs

Mise en place

Exercices

Création des classes

Dans cet exercice, vous devez implémenter une classe Monitor permettant de représenter la classe UML Monitor représentée ci-dessous, ainsi que les classes intermédiaires nécessaires.

diagramme uml
Question 1.1
Définir un type énuméré Type contenant les deux constantes BENINE et SEVERE.
Question 1.2
Définir la classe Alert
Utiliser la classe java.util.Calendar pour l'attribut date. C'est-à-dire que l''attribut date sera déclarée par private Calendar date;.
Question 1.3
Définir la classe Cardio.
La classe ArrayList implémente un tableau d'objets qui peut grandir ou rétrécir à la demande, ce qui débarrasse le programmeur de la gestion de la taille du tableau.
La méthode size() permet de connaître le nombre d'éléments du tableau.
La méthode add(Object o) permet d'ajouter l'objet o à la fin du tableau.
La méthode set(int index, Object o) modifie l'objet en position index, en lui affectant o.
La méthode get(int index) retourne l'objet se trouvant en position index.
Question 1.4
Définir la classe Patient.
Les NonNegativeNumber et PositiveInteger seront gérés par l'encapsulation...
Question 1.5
Définir la classe Monitor.

Test et nouvelles méthodes

On souhaite maintenant tester le code Java qui vient d'être écrit. Pour cela placez vous dans le package correspondant à cet exercice puis créez un nouveau fichier Test ( File>New File puis Java Classes>Java Class).

Ecrivez le code suivant dans ce nouveau fichier :

Question 1.6
Ajoutez les méthodes nécessaires à vos classes pour que ce code fonctionne.
Question 1.7
Pour le constructeur de la classe Monitor, on peut utiliser sans le modifier le code généré par le générateur automatique de code de NetBeans (bouton droit dans le fichier puis insert code puis Constructor... en cochant tous les attributs.
  • vrai
  • faux

Question 1.8
Pour le constructeur de la classe Patient, on peut utiliser sans le modifier le code généré par le générateur automatique de code de NetBeans (bouton droit dans le fichier puis insert code puis Constructor... en cochant tous les attributs.
  • vrai
  • faux

Attention ! ici, si l'on utilise le constructeur automatique de NetBeans, on obtient le code suivant:

public Patient(String firstName, String name, int age, int room, String illness) { this.firstName = firstName; this.name = name; this.age = age; this.room = room; this.illness = illness; }

qui ne tient pas compte de l'encapsulation des attributs room et age ! Il faut ajouter des tests sur ces 2 valeurs...

Question 1.9
Executez votre programme. Quel affichage obtenez-vous ?
  • ça ne compile pas
  • une exception (erreur) à l'exécution
  • le programme fait bien ce qu'on lui demande, mais ce n'est pas ce qu'on veut

Si vous avez répondu ça ne compile pas, reprenez les questions précédentes...

Le programme devrait afficher quelque chose comme monitoring.Monitor@1bc82e7 au nombre près après l'@. C'est la façon qu'à Java d'afficher une référence (i.e. le nom du package, point le nom de la classe, arobase l'adresse mémoire).

C'est bien ce qui est prévu quand on écrit System.out.println(m.toString());, mais ce n'est pas ce que l'on souhaite...

Surcharge de la méthode toString

Pour obtenir l'affichage du Monitoring souhaité, nous allons surcharger la méthode public String toString() pour qu'elle affiche le code suivant:

Tout objet Java possède par défaut une méthode public String toString() qui permet l'affichage de l'objet. Par défaut, cette méthode affiche le nom du package, suivi du nom de la classe, suivi de son adresse en mémoire (sauf pour les chaînes de caractères évidemment). Surcharger cette méthode, signifie la redéfinir dans votre classe pour que l'affichage soit correct.

Question 1.10
Ajouter une méthode public String toString() aux classes qui vous semblent pertinantes pour obtenir l'affichage souhaité.
Pour afficher une date c de type calendar, on peut utiliser par exemple la ligne de code suivante:

Notez que get(Calendar.MONTH) renvoie la valeur 0 pour le mois de janvier et 11 pour le mois de décembre → il faut ajouter +1 au résultat pour obtenir un affichage correct du numéro du mois.

Question 1.11
L'énnumération Type nécessite-t-elle la surcharge de la méthode toString() ?
  • oui
  • non

Même si l'on ne surcharge pas la méthode toString, l'énumération Type affiche BENINE ou SEVERE.

Ordonner les alertes

On souhaite maintenant trier les alertes dans l'ordre chronologique puis par sévérité croissante. Pour cela, on vous demande de rajouter une méthode public void triSelection() aux classes concernées. Le principe du tri par sélection est expliqué dans le TD 8, exercice 3.

Pour trier/ordonner des alertes, nous allons avoir besoin de les comparer entre elle: Quelle alerte doit apparaître en premier ?. Pour cela, nous allons utiliser la méthode CompareTo (puisqu'on ne peut pas utiliser Alert a, b; a < b).

Le code suivant:

devra renvoyer:

  • un nombre négatif si a doit apparaître avant b, c'est à dire si elle est plus récente que b ou si a et b ont lieu à la même date mais a est plus sévère que b.
  • zéro si a et b ont lieu en même temps et on la même sévérité.
  • un nombre positif si b doit apparaître avant a
Question 1.12
Ajouter une méthode public int compareTo(Alert a) à la classe Alert qui permet de comparer les alertes selon l'ordre décrit précédemment.
La classe Calendar possède déjà une méthode compareTo sur ce principe.
Question 1.13
Ajouter la méthode public int positionMinimum(int debut) à la classe Cardio qui retourne la position de la "plus petite" alerte dans le tableau alertes entre les position début et alertes.size() - 1.
Question 1.14
Pour écrire la méthode positionMinimum, vous avez écrit:
  • une structure de recherche avec la forme compacte
  • une structure de recherche avec la forme historique
  • une strucutre de parcours avec la forme compacte
  • une structure de parcours avec la forme historique

Une structure de recherche n'a pas de forme compacte ou historique. Juste une form où l'on met 2 conditions après le while: la condition portant sur les bornes et la négation de la propriété recherchée.

Ici, on doit parcourir tout le tableau pour trouver le minimum. Par ailleurs, même si la strucutre de parcours avec la forme compacte paraît toute indiquée puisqu'on utilise un conteneur d'objet, elle ne nous permet pas de partir d'un indice donné (ici debut). Du coup, il nous faut utilier une structure de parcours avec la forme historique.

Si vous n'avez rien compris à cette explication, c'est le moment de relire votre cours sur le structures de parcours ainsi que celui sur les structures de recherche.

Question 1.15
Ajouter une méthode private void echanger(int i, int j) à la classe Cardio qui permetd'échanger les alertes stockées dans le tableau aux positions i et j (utilisez les méthodes set et get de la classe ArrayList).
Question 1.16
Ajouter la méthode public void triSelection() à la classe Cardio qui permet de trier les alertes contenues dans le tableau.
Question 1.17
Ajouter la méthode public void OrdonnerAlertes() à la classe Monitor qui fait appel à la méthode triSelection que vous venez de définir.
Question 1.18
Appliquez cette méthode sur l'exemple donné dans le main précédent. Vous devez obtenir :
Question 1.19
Quelles lignes avez-vous ajoutées à la méthode main pour obtenir ce test ?

    m.OrdonnerAlertes(); System.out.println(m);
Question 1.20
Les 2 alertes qui arrivent en même temps sont toutes les deux sévères.
  • vrai
  • faux

Ces 2 alertes arrivent le 07/12/2007 à 12:05 et concernent les EEG, mais l'une est sévère et l'autre est bénine.

La liste chaînée est une structure de données que l'on retrouve fréquemment en informatique.

Elle nécessite de représenter chaque élément de la liste par un couple (valeur, suivant), désignant respectivement la valeur au point courant et la référence sur le chaînon suivant.

Liste Chaînée
Figure 2.1. Exemple de liste chaînée

En Java, cela s'écrit très aisément :

Question 2.1
Créez une nouvelle classe Element définir le constructeur par défaut qui initialisera la valeur de l'élément à 0 et la référence à l'élément suivant à null.
Question 2.2
Définir un second constructeur pour la classe Element qui prend en argument un entier destiné à l'initialisation de la valeur de l'élément.
Question 2.3
Ecrire les accesseurs et les modificateurs de la classe Element.
Question 2.4
Pour créer les accesseurs et les modificateurs, on peut utiliser la génération automatique de code par NetBeans (bouton droit de la souris dans la classe, insert code... Getter... et Setter...)
  • vrai
  • faux

On souhaite maintenant tester le code Java qui a vient d'être écrit. Pour cela, Ecrivez le code suivant dans une méthode main.

Question 2.5
Exécutez votre programme. Quel affichage obtenez-vous ?
  • valeur de l'élément a : 0 valeur de l'élément a : 8
  • valeur de l'élément a : 0 valeur de l'élément a : 0
  • valeur de l'élément a : 8 valeur de l'élément a : 8

Nous allons maintenant définir la classe Liste représentant une liste chaînée d'entiers.

Une liste est décrite par la connaissance du nombre d'éléments qu'elle contient et de son premier élément : en effet, à partir de celui-ci, il est possible de connaître tous les autres éléments.

Question 2.6
Créez la classe Liste.
Question 2.7
Définir le constructeur par défaut de la classe Liste qui initialisera la référence de la tete de la liste chaînée à null.
Question 2.8
Ajouter une méthode public void ajouterDebut(Element e) à la classe Liste qui ajoute un élément en début de la liste et dont la valeur est passée en argument.

Pour tester cette nouvelle méthode, nous voulons effectuer les opérations de la figure suivante:

Test de la Méthode ajouterDebut
Figure 2.2. Scénario de test de la méthode ajouterDebut de la classe Liste
Question 2.9
Ajouter le code correspondant à la méthode main (et vérifier que votre méthode ajouterDebut fait bien ce que vous souhaitez...).

On considère les 3 codes suivants pour la méthode main

Question 2.10
Au final, dans la méthode main, vous avez le code correspondant:
  • à l'extrait N°1
  • à l'extrait N°2
  • à l'extrait N°3

Question 2.11
Ajouter une méthode public void afficher() à la classe Liste affichant les valeurs des éléments de la liste en partant du premier élément, sous la forme suivante par exemple : [6, 8, 4, 7, 12].
Il pourra s'avérer utile d'ajouter une méthode public String toString() à la classe Element.
Question 2.12
Pour écrire la méthode afficher, vous avez utilisé
  • une structure algorithmique de parcours
  • une structure algorithmique de recherche

Cette question est un peu sioux, en effet, même si on parcourt toute la liste chaînée, on ne connaît pas le nombre exact d'éléments.

On recherche donc le dernier élément qui a la propriété getSuivant() == null...

Question 2.13
Ajouter la ligne liste.afficher(); à la fin de votre méthode main et vérifiez que vous obtenez bien: [6, 8].
Question 2.14
Ajouter à la classe Liste une méthode public void ajouterDebut(int valeur) qui crée un Elément avec la valeur passée en paramètre et l'ajoute en début de liste.
On pourra utiliser la méthode déjà créée public void ajouterDebut(Element e).
Question 2.15
Créez une nouvelle classe de test et copiez le code ci-dessous pour tester votre liste chaînée.
Il pourra être utile de récupérer la classe LectureClavier des précédents TPs...
Question 2.16
Les nombre de la liste chaînée:
  • sont affichés dans l'ordre dans lequel on les a entrés.
  • sont affichés dans l'ordre inverse de l'ordre dans lequel on les a entrés.

Question 2.17
Ajouter une méthode public boolean rechercheValeur(int valeur) à la classe Liste qui retourne true si la valeur mise en argument est présente dans la liste; false sinon.
Question 2.18
Complétez la méthode main afin de tester cette méthode de recherche.
Question 2.19
Ajouter une méthode public void supprimerValeur(int valeur) à la classe Liste qui supprime la première occurence de valeur dans la liste.
Question 2.20
Complétez la méthode main afin de tester cette méthode de suppression.