1. Références

2. Mise en place

Se référer au paragraphe Mise en place du cours Java EE.

3. Manipulation de tableaux

Implémenter une méthode qui accepte deux paramètres m et n de type int et qui crée une matrice de dimensions m x n. La valeur de la cellule de coordonnées [i][j] est i + j.

Par exmple, voici le tableau résultat de la méthode avec les paramètres 4 et 3 :

  i = 0 i = 1 i = 2 i = 3

j = 0

0

 1

 2

3

j = 1

2

3

4

j = 2

2

 3

4

5

4. Manipulation de listes

4.1. Itération

4.1.1. Somme

Soit une liste d’entiers. Implémenter une méthode sum() qui retourne la somme des éléments de la liste.

4.1.2. Groupement

Implémenter une méthode group() qui retourne les éléments d’une liste groupés par type. Le groupement se fait selon les règles suivantes :

  1. Le premier groupe comprend les chaînes de caractères,

  2. Le deuxième groupe les éléments de type Integer,

  3. La troisième tous les autres.

Chaque groupe est géré par un type Collection.

Par exemple, avec la liste de la section suivante, le résultat doit être une Collection qui comprend :

  1. ["banana", "apple", "orange"]

  2. [2, 1, 3]

  3. [null, java.lang.Object@cafebabe, Tue Aug 22 15:18:21 CEST 2017]]

4.2. Comparateurs

Voici un échantillon de code qui pourra être utilisé comme test dans les exercices de cette section :

List list = Arrays.asList(2, 1, "banana", null, "apple", "orange",
                          3, new Object(), new java.util.Date());

4.2.1. Tri avec un comparateur

Implémenter une méthode sortWithSetComparator() qui trie une liste avec un comparateur explicite en utilisant l’ordre suivant :

  1. Les entiers, puis dans l’ordre naturel des entiers,

  2. Les chaînes de caractères, puis dans l’ordre naturel des chaînes de caractères,

  3. Les éléments qui ne sont pas de type Object,

  4. Les éléments de type Object,

  5. Enfin, les valeurs null.

Avec la liste échantillon, le résultat doit être le suivant :

[1, 2, 3, "apple", "banana", "orange", Tue Aug 22 15:18:21 CEST 2017, java.lang.Object@cafebabe, null].

4.2.2. Chaînage de comparateurs

Soit le code suivant :

public class Person {
    private final String firstName;
    private final String lastName;
    public Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
    // Getters and setters
}

public class ByFirstNameComparator implements Comparator { ... }

public class ByLastNameComparator implements Comparator { ... }

En réutilisant les classes existantes, créer une implémentation de comparateur ByLastNameThenFirstNameComparator qui compare deux instances de Person :

  1. Par leur attribut lastName,

  2. Puis en cas d’égalité par leur attribut firstName.

4.2.3. Tri par ordre naturel

Implémenter une méthode sortWithNaturalOrder() qui trie la liste passée en paramètre dans l’ordre naturel des éléments. Tester avec la liste échantillon.

  1. Quel est le résultat obtenu ?

  2. Expliquer la raison.

  3. Proposer une solution pour corriger le problème.

4.3. Tri par ordre naturel - système de fichiers

Implémenter une méthode listDirectory() qui accepte en paramètre le chemin vers un répertoire et retourne la liste triée des enfants de ce répertoire.

  1. Appeler la méthode en passant un répertoire avec un nombre conséquent d’enfants.

  2. Constater l’orde utilisé.

  3. Chercher la confirmation à l’aide de la JavaDoc.

5. Manipulation de sets

Soit la classe Person suivante :

Person.java
public class Person {
    private final String name;
    private final String avs;
    public Person(String name, String avs) {
        this.name = name;
        this.avs = avs;
    }

    public static void main(String... args) {
        Person p1 = new Person("John Doe", "756-1234-5678-97");
        Person p2 = new Person("John Doe", "756-1234-5678-97");
        Person p3 = new Person("John Amden", "111-11-111-113");
        Set persons = new HashSet();
        persons.add(p1);
        persons.add(p2);
        persons.add(p3);
        System.out.println(persons.size());           (1)
        System.out.println(p1.equals(p2));            (2)
    }
}

En surchargeant uniquement les méthodes adéquates dans la classe Person, faire en sorte que le résultat de l’exécution du code précédent soit :

2    (1)
true (2)

6. Manipulation de dictionnaires

Soit le code suivant :

public class Wrapper {
    private final int id;
    public Wrapper(int id) {
        this.id = id;
    }

    @Override
    public boolean equals(Object o) {
        return o instanceof Wrapper && this.id == ((Wrapper) o).id;
    }

    @Override
    public int hashCode() {
        return 1;                              (1)
    }

    public static void main(String... args) {
        Map map = new HashMap();               (2)
        int limit = 10_000_000;                (3)
        for (int i = 0; i < limit; i++) {
        Wrapper w = new Wrapper(i);
        map.put(w, w);
    }
}
  1. Expliquer le problème posé par le code. Le corriger.

  2. Quels sont le(s) paramètre(s) à passer dans le constructeur de la HashMap pour optimiser le temps d’exécution du code ? Justifier.

  3. En quoi la réponse à la question précédent diffère si la valeur de la variable limit n’est pas connue ?