:: Enseignements :: ESIPE :: E4INFO :: 2014-2015 :: Java Avancé ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) |
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.
-
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.
-
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.
-
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.
-
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.
-
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.
-
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.
-
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.
-
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().
-
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.
-
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.
© Université de Marne-la-Vallée