:: Enseignements :: ESIPE :: E4INFO :: 2019-2020 :: Java Avancé ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | Examen de Java Avancé - Session2 |
Le but de ce TP noté est d'implanter une structure de données Tab qui permet de représenter
à la fois des vecteurs (des tableaux à 1 dimension) et des matrices (des tableaux à 2 dimensions).
On retrouve cette structure de données comme valeur de base dans les langages de programmation
APL, J et K.
Vos sources Java produites pendant l'examen devront être placées sous le répertoire EXAM de votre compte ($HOME)
(qui est vide dans l'environnement de TP noté). Sinon, elles ne seront pas récupérées.
Tout document papier est proscrit.
Vous pouvez consulter la javadoc à travers Eclipse (onglet Javadoc), en utilisant
jdoc dans un terminal
Sinon la doc est là:
/usr/local/apps/java13/docs/api/index.html.
Les seuls documents électroniques autorisés sont les supports de cours à l'url
http://igm.univ-mlv.fr/~forax/ens/java-avance/cours/pdf/.
Vous avez le droit de lire le sujet jusqu'au bout, cela vous donnera une bonne idée de là où on veut aller !
Exercice 1 - Tab
En interne, Tab stocke les éléments dans un tableau à une seule dimension mais
peut lire celui-ci soit comme un tableau à une seule dimension, soit comme un tableau à deux dimensions.
Pour cela, en plus du tableau, Tab possède deux champs row et column
qui correspondent respectivement au nombre de lignes et nombres de colonnes.
Dans le cas où Tab représente un vecteur, row est égal à 1 et column est
le nombre de valeur du vecteur, dans le cas où Tab représente une matrice, row est
le nombre de lignes et column le nombre de colonnes.
De plus,
Tab possède les méthodes
-
row() et column() qui renvoie respectivement le nombre de lignes et le nombre
de colonnes
-
equals() et hashCode() qui ont le comportement habituel
-
vector() qui permet de créer un vecteur à partir d’éléments pris en paramètre et séparés par des virgules (de gauche à droite).
-
matrix() qui permet de créer une matrice à partir du nombre de lignes et du nombre de colonnes
suivis par les éléments séparées par des virgules (de gauche à droite, de haut en bas).
Important : la classe
Tab possède au moins un élément et est non-mutable. Elle est paramétrée par le type des éléments qu'elle stocke et les éléments ne peuvent pas être
null.
Voici un exemple d'utilisation de la classe
Tab.
Tab<String> vector = Tab.vector("foo", "bar", "baz"); // 1 ligne x 3 colonnes
Tab<Integer> matrix = Tab.matrix(2, 3, 1, 2, 3, 4, 5, 6); // 2 lignes x 3 colonnes
Des tests unitaires correspondant à l'implantation sont ici:
TabTest.java.
-
Créer la classe Tab avec la méthode vector qui prend en paramètre les éléments
séparés par des virgules.
Puis ajouter les méthodes equals et hashCode.
Utiliser les méthodes equals() et hashCode() générés par votre IDE préféré
sera sévèrement sanctionné.
Vérifier que votre code passe les tests JUnit marqués "Q1".
-
Ajouter une méthode toString qui permet d'afficher les éléments séparés
par des virgules.
Vérifier que votre code passe les tests JUnit marqués "Q2".
-
Ajouter la méthode matrix qui prend en paramètre un nombre de lignes et un nombre de colonnes
puis les différents éléments séparés par des virgules. Les éléments correspondent à la première ligne, suivie de la seconde ligne, etc.
Par exemple:
matrix(2, 3, 1, 2, 3, 4, 5, 6);
correspond à la matrice avec deux lignes et trois colonnes
1, 2, 3
4, 5, 6
La méthode matrix doit de plus, empécher la création de vecteurs (de matrices à une ligne).
Ajouter aussi les méthodes row() et column().
Vérifier que votre code passe les tests JUnit marqués "Q3" et bien sûr, que les tests
précédents fonctionnent toujours !
-
Modifier la méthode toString pour que dans le cas où l'instance de Tab
est une matrice, en plus de l'affichage sur plusieurs lignes, l'affichage affiche sur la première
ligne le nombre de lignes et le nombre de colonnes séparé par une virgule.
Par exemple, toujours avec la matrice
matrix(2, 3, 1, 2, 3, 4, 5, 6);
l'affichage est
2, 3
1, 2, 3
4, 5, 6
La première ligne indique que la matrice a 2 lignes de 3 colonnes.
Note : il y a bonus si vous arrivez à écrire la méthode avec une seule expression.
Vérifier que votre code passe les tests JUnit marqués "Q4".
-
Écrire une méthode apply que l'on applique sur une instance de Tab et qui prend
en paramètre une fonction binaire et une autre instance de Tab
qui pré-suppose que les deux instances ont la même taille et renvoie une nouvelle instance de Tab créé en effectuant l'opération sur les éléments correspondants des Tab.
Par exemple, avec
var m = matrix(2, 3, 1, 2, 3, 4, 5, 6);
var one = matrix(2, 3, 1, 1, 1, 1, 1, 1);
var result = m.apply(Integer::sum, one);
result est la matrice dont l'affichage est
2, 3
2, 3, 4
5, 6, 7
Et bien sûr, apply marche aussi avec les vecteurs !
Vérifier que votre code passe les tests JUnit marqués "Q5".
-
Écrire une méthode forEach qui prend en paramètre une fonction ayant en paramètre
un numéro de ligne, un numéro de colonne et un élément et appelle cette fonction pour chaque
élément du Tab.
Par exemple, avec
var v = vector("foo", "bar");
v.forEach((r, c, e) -> System.out.println(r + " " + c + " " + e));
affiche
0, 0, foo // ligne 0 colonne 0 element foo
0, 1, bar // ligne 0 colonne 1 element bar
Vérifier que votre code passe les tests JUnit marqués "Q6".
-
Écrire une méthode rowIterator qui prend en paramètre un numéro de ligne et renvoie
un itérateur qui permet de parcourir tous les éléments d'une même ligne.
Note : pour des raisons d'efficacité, vous devez écrire vous même le code de l'itérateur pour cette question (et pas simplement renvoyer l'itérateur produit par une méthode de l'API Java).
-
Écrire une méthode reshape qui prend en paramètre un nouveau nombre de lignes et de colonnes et
renvoie un Tab qui a le nombre de lignes et de colonnes demandés.
Si le Tab renvoyé à moins de valeurs possibles que le Tab initial, celles-ci ne sont pas
recopiées. Si le Tab renvoyé à plus de valeurs possibles que le Tab initial, le nouveau
Tab cycle sur les valeurs existantes.
Par exemple, avec un vecteur vector(1, 6, 4) si on appel reshape(1, 5), alors
le Tab renvoyé est équivalent à vector(1, 6, 4, 1, 6).
Vérifier que votre code passe les tests JUnit marqués "Q7".
-
Enfin, écrire une méthode rowList qui prend en paramètre un numéro de ligne et renvoie
une liste ordonnée et non mutable des valeurs sur la ligne demandée.
Par exemple, avec la matrice dont l'affichage est
2, 3
1, 2, 3
4, 5, 6
un appel à rowList(1) renvoie la liste [4, 5, 6].
Vérifier que votre code passe les tests JUnit marqués "Q8".
© Université de Marne-la-Vallée