:: Enseignements :: ESIPE :: E4INFO :: 2014-2015 :: Java Avancé ::
[LOGO]

Liste, table de hachage, entrée/sortie, stream, lambdas


Pour Utiliser Java 9, vous devez lancer Eclipse-light. Si ce n'est pas déjà fait, dans Window > Preferences > Java > Installed JREs, ajouter celui de Java 9 (il doit être dans /usr/local/apps/java).
Il ne vous reste plus qu'à le selectionner pour votre projet (Configure Build Path...).

Exercice 1 - Scoobi Dooooo

Le but de cet exercice est de manipuler un ensemble de films, extrait du fichier movies.txt pour trouver quel acteur à jouer dans le plus de film.

  1. Dans un premier temps, écrivez un code qui lit le fichier ligne à ligne avec la méthode Files.lines et stocke dans une table de hachage la liste des acteurs correspondante (dans une Map<String, List<String>> donc).
    Pour séparer une chaine de caractèrez en plusieurs partiez, il existe la méthode String.split(). Il existe de plus une méthode Stream.skip() qui permet de ne pas prendre en compte des valeurs dans un stream.
  2. On cherche maintenant à afficher le nombre total d'acteurs ayant jouer dans au moins un film.
    A quoi sert la méthode Stream.flatMap(), comment peut on l'utiliser dans notre cas ?
    Ne pas compter le même acteur plusieurs fois revient à éviter d'avoir des doublons, quelle structure de données doit-on utiliser pour stocker les acteurs ?
    Implanter le calcul du nombre total d'acteurs.
  3. En fait, il existe une méthode Stream.distinct(), comment peut-on l'utiliser pour trouver le nombre total d'acteurs.
    Ecrire le code correspondant.
  4. On souhaite maintenant calculer le nombre de films pour chaque acteur.
    Dans un premier temps, nous allons calculer, pour chaque acteur, la liste des films dans lesquels il a joué. Comment utiliser la méthode Collectors.groupingBy(Function) pour cela ?
    Note: il existe une méthode Function.identity() !
    Ecrire le code correspondant.
  5. La méthode Collectors.html.groupingBy(Function, Collector) permet de spécifier en second paramètre une opération à effectuer au lieu d'ajouter les films dans une liste.
    Utiliser celle-ci pour calculer le nombre de film pour chaque acteur, dans une Map<String, Long> donc.
  6. Il reste enfin à trouver l'acteur (le couple nom d'acteur/nombre de film) pour lequel le nombre de films est le plus grand.
    Pour cela, il faut voir la Map comme un ensemble de couples (en utilisant entrySet) puis trouver le couple ayant le plus grand nombre de films grâce à la méthode Collectors.maxBy().
    Ecrire le code correspondant.

Exercice 2 - Fichiers

On cherche à ecrire un programme équivalent à la commande Unix ls qui permet de lister les fichiers d'un répertoire pris en paramètre.
Le programme possède les options suivantes
  • --a qui demande l'affichage de tous les fichiers, par défaut les fichiers commançant par '.' ne sont pas affichés.
  • --r qui demande un parcours récursif des fichiers et affiche les fichiers stockés dans les sous-répertoires.
Ces options sont combinables dans n'importe quel ordre et le résultat ne doit pas dépendre de l'ordre spécifié par l'utilisateur.
Enfin, par défaut, la commande affiche le contenu du répertoire courant (.) si aucun répertoire n'est spécifié en paramètre.

  1. Sachant que pour lister les fichiers d'un répertoire il existe la méthode Files.list(), écrire le code du main qui affiche le contenu d'un répertoire (un fichier par ligne) pris en argument de la ligne de commande.
  2. On souhaite que l'affichage soit relatif au chemin pris en paramètre, donc au lieu d'avoir les noms des fichiers préfixés par "./"
         ./foo.txt
         ./src
        
    on veut que l'affichage soit
          foo.txt
          src
        
    Modifier votre code en utilisant la méthode Path.relativise().
  3. Implanter l'option --a ainsi que la possibilité de ne pas avoir de repertoire spécifié sur la ligne de commande.
    Note: Il est possible de faire un switch sur des String en Java.
  4. Ajouter le code de gestion de l'option --r.
    Note: il existe une méthode Files.walk
    Note2: evitez le copier/coller.
    Note2: evitez le copier/coller. :)
    Note3: Attention à gérer correctement l'exception IOexception.