#1. Les questions auxquelles vous avez échappé dans l'interro
Répondez aux questions à partir du cours. Vérifiez ensuite vos réponses dans un programme.
#1.1. Interface
Si A implémente l'interface I, quelles sont les instructions correctes ?
I a = new A();
I a = (I) new A();
A a = new A();
I a = new I();
A a = (A) new I();
#1.2. Polymorphisme et Lien dynamique
Soit les classes A et B suivantes :
class A {
void m() {
System.out.println("méthode m de A");
}
void n() {
System.out.println("méthode n de A");
}
}
class B extends A {
void m() {
System.out.println("méthode m de B");
}
void p() {
System.out.println("méthode p de B");
}
}
Que donnent les instructions suivantes ?
A aa = new A();
A ab = new B();
B ba = (B) new A();
B bb = new B();
aa.m();
ab.m();
bb.m();
aa.n();
ab.n();
bb.n();
aa.p();
ab.p();
bb.p();
#2. Généricité
#2.1. Exercice 1
Soit la classe Pair
public class Pair<T> {
private T first;
private T second;
public Pair() {
first = null;
second = null;
}
public Pair(T first, T second) {
this.first = first;
this.second = second;
}
public T getFirst() { return this.first; }
public void setFirst(T first) { this.first = first; }
public T getSecond() { return this.second; }
public void setSecond(T second) { this.second = second; }
}
Questions :
-
Créez une classe
ArrayUtils
-
Créez une méthode statique et générique
firstElements
qui :- prend un tableau de T
- renvoie les deux 1ers élements du tableau en utilisant une
Pair
(utiliseznull
dans la paire s‘il n'y a pas assez d’éléments dans le tableau)
-
Créez une méthode statique et générique
minAndMax
qui :- prend un tableau de T
- renvoie l'élément de valeur minimale et celui de valeur maximale en utilisant une
Pair
(donc uniquement pour des élements de typeT
qui implémententComparable
)
Exemple d'utilisation :
Integer[] tab = {1, 2, 3};
Pair<Integer> firsts = ArrayUtils.firstElements(tab);
System.out.println(firsts.toString());
String[] phrase = {"marie", "possède", "une", "petite", "lampe"};
Pair<String> extr = ArrayUtils.minAndMax(phrase);
System.out.println(extr.toString());
#3. Collections
#3.1. Stock (suite du TP1.4)
#3.1.1. Exercice 1
Créez une classe Stock
permettant de gérer collection de devices et contenant
- une
ArrayList
permettant de stocker plusieurs devices- dans la suite on utilisera autant que possible les méthodes associées à cette classe
- les parcours pourront se faire avec une boucle “foreach” ou un iterator explicite
- un constructeur par défaut
- une méthode pour ajouter un matériel
- une méthode pour connaitre le nombre de devices en stock
- une méthode pour connaitre le nombre de devices d'une certaine classe en stock (argument de type
Class<? extends Device>
) - 2 méthodes pour récupérer et sortir du stock le 1er device disponible
- à partir de sa classe
- à partir de sa référence ou son nom
- elles renverront une exception si l'élément n'est pas trouvé
- des méthodes qui retournent (cf streams)
- un sous-stock des devices d'une certaine classe
- un sous-stock des devices d'un certain OS
- la moyenne du prix d'achat des devices d'un stock
Testez dans DeviceDemo
- utilisez 2 stocks
- remplissez le 1er de 10 téléphones et 12 caméras
- déplacez des élements d'un stock à l'autre
- obtenez un sous-stock d'iphones et calculez son prix moyen
#3.1.2. Exercice 2
Modifiez Device
pour qu'elle implémente Comparable<Device>
- implémentez la méthode
int compareTo(Device)
en utilisant l'ordre sur les références
Ajoutez à Stock
une méthode pour trier la collection de devices par référence
Remarque : dans le TP1 la référence était libre, vous pouvez remplacer cela
- par un mécanisme d'entier automatique comme pour les clients
- ou mieux, par un mécanisme qui concatène le nom de la classe avec un entier incrémenté automatiquement pour chaque classe (ex. “Phone_01”, “Camera_01”…)
#3.2. Personnes (suite du TP1-Partie 3)
#3.2.1. Exercice 1 : liste
Créez une classe PeopleList
permettant de gérer une collection de personnes et contenant
- une
ArrayList
permettant de stocker plusieurs personnes - un constructeur par défaut
- une méthode d'ajout d`une personne
- retourne un booléen
- doit vérifier que la personne n'est pas déjà dans la liste
- nécessite de définir equals() et hashCode() pour les personnes (on utilisera uniquement l'ID pour celà)
- une méthode de retrait d'une personne à partir de son ID
- retourne un booléen
- une méthode qui retourne le nombre de personnes
- la méthode
toString()
Modifiez la classe PeopleDemo
pour tester
#3.2.2. Exercice 2 : requêtes
Ajoutez :
- une méthode pour récupérer une personne à partir de son ID
- retourne une exception s'il n'existe pas (trouver celle qui correspond le mieux)
- une méthode pour récupérer à partir d'un nom la liste des personnes correspondants
#3.2.3. Exercice 3 : tris
Ajoutez :
- une méthode pour trier les personnes par ID dans la liste, nécessite que
People
implémenteComparable<People>
- définisse une méthode
int compareTo(People)
- qui utilise l'ordre des
Integer
(cohérence avec equals)
- une méthode pour trier les personnes par ordre alphabétique du nom/prénom dans la liste, nécessite de
- créer une nouvelle classe qui implémente
Comparator<People>
- qui définisse une méthode
compare
entre 2 personnes - qui utilise l'ordre des
String
- créer une nouvelle classe qui implémente
#3.3. Entreprise et Employés
#3.3.1. Exercice 1
On va étendre l'exercice sur les employés du TP précédent en ajoutant la relation à une entreprise.
-
Créez une classe
Entreprise
:- nom
- collection d'employé :
HashSet<Employe>
-
L'association entre une entreprise et ses employés est bidirectionnelle : une entreprise connaît ses employés et un employé connaît son entreprise
- Modifiez
Employe
en conséquence
- Modifiez
-
Créez 2 méthodes pour l'arrivée et le départ d'un employé dans une entreprise
- Gérez les répercussions sur l'employé
- Créez et utiliser une classe
EmployeException
pour remonter les problèmes d'arrivée et de départ
-
Créez une méthode qui décrit une entreprise en affichant son nom et les noms de tous ses employés (avec
StringBuilder
) -
Créez une classe de démo avec 2 entreprises
#3.3.2. Exercice 2
-
On souhaite pouvoir itérer sur les employés depuis l'extérieur d'une entreprise.
- Dans la classe
Entreprise
- Ajoutez une méthode
getEmployeIterator()
qui renvoie un itérateur sur la collection d'employés
- Ajoutez une méthode
- Dans la classe de test, écrivez 2 méthodes pour calculer le total des salaires des employés de chacune des 2 entreprises
- 1 avec parcours explicite via l'itérateur
- 1 avec boucle “for-each”
- Dans la classe
-
On souhaite trier les employés par nom
- Modifiez la classe
Employe
pour qu'elle implémente l'interfaceComparable<Employe>
- Ajoutez une méthode
compareTo
qui utilise l'ordre alphabétique comme ordre “naturel” des employés
- Ajoutez une méthode
- Dans la classe de test, écrivez 1 méthode qui affiche les noms et salaires des employés d'une entreprise, par ordre alphabétique de leur nom
- copiez tous les employés dans une
ArrayList
- triez la liste (via la classe
Collections
)
- copiez tous les employés dans une
- Modifiez la classe
-
On souhaite trier les employés par salaire
- Créez une classe qui implémente l'interface
Comparator<Employe>
pour comparer les employés par leur salaire- booléen croissant
- constructeurs
- méthode
int compare(Employe e1, Employe e2)
- Dans la classe de test, écrivez 1 méthode qui affiche les noms et salaires des employés d'une entreprise, classés par salaire décroissant ou croissant
- Créez une classe qui implémente l'interface