IPRO - TP3
Généricité et Collections
Guillaume Bouyer
ENSIIE

#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 vue en cours et rappelée ci-dessous

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 :

  1. Créez une classe ArrayUtils

  2. 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 (utilisez null dans la paire s‘il n'y a pas assez d’éléments dans le tableau)
  3. 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 type T qui implémentent Comparable)

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

Testez dans DeviceDemo

#3.1.2. Exercice 2

Modifiez Device pour qu'elle implémente Comparable<Device>

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

#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

Modifiez la classe PeopleDemo pour tester

#3.2.2. Exercice 2 : requêtes

Ajoutez :

#3.2.3. Exercice 3 : tris

Ajoutez :

#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.

  1. Créez une classe Entreprise :

  2. 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
  3. 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
  4. Créez une méthode qui décrit une entreprise en affichant son nom et les noms de tous ses employés (avec StringBuilder)

  5. Créez une classe de démo avec 2 entreprises

#3.3.2. Exercice 2

  1. 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
    • 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”
  2. On souhaite trier les employés par nom

    • Modifiez la classe Employe pour qu'elle implémente l'interface Comparable<Employe>
      • Ajoutez une méthode compareTo qui utilise l'ordre alphabétique comme ordre “naturel” des employés
    • 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)
  3. 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