Exercice 1 : Découverte de l`objet de type ArrayList Exercice 2

Transcription

Exercice 1 : Découverte de l`objet de type ArrayList Exercice 2
I.U.T. Reims-Châlons-Charleville
Département Informatique
Année 2013-2014
Structures de données
Travaux Pratiques sur Feuilles - Sujet 2
Notions : Classe ArrayList, Tableaux de taille dynamique
Durée :
Semaines 47 - 48
Exercice 1 : Découverte de l’objet de type ArrayList
Q1. Écrire le code qui permet de déclarer :
a) un ArrayList de booléens,
b) un ArrayList d’entiers,
c) un ArrayList de réels,
d) un ArrayList de chaı̂nes de caractères.
Q2. On considère l’initialisation suivante :
ArrayList<Turtle> arrTurtle = new ArrayList<Turtle>( 20 );
a) Combien d’éléments possède le tableau dynamique arrTurtle ?
b) Combien d’éléments peut-il en posséder au maximum ?
Plus généralement, combien de cases peut contenir un tableau dynamique au maximum ?
c) Que fait cette initialisation ?
Q3. Soit une variable arr référençant un ArrayList de réels. On veut s’assurer que toutes les
valeurs de ce tableau sont comprises entre deux constantes de type réel nommées MIN V et MAX V. Si
une case du tableau contient une valeur plus petite que MIN V, on lui affecte alors la valeur MIN V.
De même, si une case du tableau contient une valeur plus grande que MAX V, on lui affecte alors la
valeur MAX V.
Écrire une méthode checkValues qui effectue ce test sur un ArrayList passé en paramètre.
(Facultatif ) Écrire une seconde version de cette méthode où on explicite tout le code (comme si
on devait programmer avec une version de Java antérieur au SDK 5.0 - ou SDK 1.5 -, où l’auto-boxing
n’existe pas).
Exercice 2 : Implémentation d’un tableau dynamique
Le but de cette partie est de mieux comprendre le fonctionnement de la classe ArrayList. Pour
cela, on va programmer une partie des méthodes que possède cette classe.
On va se restreindre ici à un tableau dynamique de chaı̂nes de caractères.
Pour mettre en place notre propre tableau dynamique, nous aurons besoin de deux variables
accessibles depuis toutes les méthodes (on ne les passera pas en paramètre) :
– int size = 0 ; // Nombre de cases utilisées dans le tableau
– String [ ] array = { } ; // Tableau associé au tableau dynamique
Par convention, chaque fois qu’on aura besoin d’accéder à ces variables, on écrira :
– this.size pour accéder à size.
– this.array pour accéder à array.
1
P. Vautrot - 14 novembre 2013
I.U.T. Reims-Châlons-Charleville
Département Informatique
Année 2013-2014
Structures de données
On utilisera cette convention pour différencier ces deux variables (qu’on peut appeler attribut) des
variables locales et des paramètres d’une méthode.
Remarque : Si vous voulez tester ces méthodes en java, vous devrez déclarer ces variables à
l’extérieur des méthodes en les précédant du mot clé static. Vous remplacerez le mot clé this par
le nom de la classe. Par exemple, si la classe créée sous BlueJ s’appelle TPF2, vous accéderez aux
variables/attributs en écrivant TPF2.size et TPF2.array (ou plus simplement en écrivant size et
array).
Q1. Écrire une méthode grow qui permet d’allouer un tableau plus grand pour le tableau dynamique. La nouvelle taille demandée est passée en paramètre.
On recopiera bien-sûr les valeurs de l’ancien tableau dans le nouveau tableau et this.array
référencera ce nouveau tableau.
Si la nouvelle taille du tableau n’est pas plus grande que la taille actuelle du tableau, la méthode
ne fait rien.
On écrira deux versions de cette méthode dont l’une n’utilisera pas la méthode Arrays.copyOf
décrite ci-dessous :
String [ ] Arrays.copyOf( String [ ] original, int newLength ) : copie le tableau spécifié en paramètre en le tronquant ou en l’étendant avec des cases contenant la
référence null de telle sorte que le nouveau tableau ait la taille spécifiée en paramètre.
La méthode renvoie le tableau, tronqué ou étendu selon la valeur de newLength.
Q2. Écrire une méthode add qui ajoute une chaı̂ne de caractères passée en paramètre à la fin du
tableau dynamique. Si le tableau courant n’a plus de case libre, on doublera sa taille.
Q3. Écrire une méthode qui permet d’insérer, à une position donnée passée en paramètre (de
type int), l’élément passé en paramètre. Si la position n’est pas correcte, on lancera une exception
(Exception) avec le message ”Index out of bounds exception”.
Peut-on nommer cette méthode add ? Pourquoi ?
Q4. Écrire une méthode remove qui supprime du tableau l’élément dont la position (indice) est
passée en paramètre. Si la position n’est pas correcte, on lancera une exception (Exception) avec le
message ”Index out of bounds exception”.
Q5. Écrire une méthode indexOf qui recherche dans le tableau la position (indice) de l’élément
passé en paramètre.
Cette méthode renvoie la position de l’élément ou −1 si celui-ci ne se trouve pas dans le tableau.
Q6. Écrire une méthode qui supprime du tableau l’élément passé en paramètre. Cette méthode
renvoie true si l’opération s’est bien déroulée, false si le tableau ne contient pas un tel élément.
Peut-on appeler cette méthode remove ? Pourquoi ?
Q7. Écrire une méthode toArray qui copie les éléments du tableau dynamique dans un tableau
classique passé en paramètre. Si ce dernier ne contient pas assez de cases, on crée un nouveau tableau
avec le bon nombre de cases. La méthode renvoie le tableau en paramètre ou celui créé le cas échéant.
2
P. Vautrot - 14 novembre 2013
I.U.T. Reims-Châlons-Charleville
Département Informatique
Année 2013-2014
Structures de données
Q8. Écrire une méthode toString qui renvoie dans une chaı̂ne de caractères la représentation du
contenu du tableau dynamique. Le format sera le suivant :
[ ”première chaı̂ne”, ”seconde chaine”, ..., ”dernière chaine” ]
Exercices complémentaires
Q9. Écrire une méthode addAll qui reçoit en paramètre un objet de type ArrayList contenant des
chaı̂nes de caractères, et qui rajoute au tableau dynamique le contenu de l’objet passé en paramètre.
On s’arrangera pour que, si la taille du tableau actuel n’est pas suffisante, sa nouvelle taille soit
au minimum égale au double de sa taille actuelle.
Q10. Écrire une méthode removeRange qui supprime tous les éléments du tableau dont les indices
sont compris entre deux indices fromIndex inclus et toIndex exclu passés en paramètre.
La méthode lance une exception avec le message ”Index out of bounds exception” si les indices
passés en paramètre ne sont pas corrects.
Q11. Écrire une méthode retainAll qui reçoit en paramètre un objet de type ArrayList contenant
des chaı̂nes de caractères, et qui supprime du tableau toutes les valeurs qui ne se trouvent pas dans
l’objet passé en paramètre.
Remarque : La classe ArrayList contient une méthode contains qui renvoie true si l’élément
passé en paramètre est contenu dans l’objet, false sinon.
3
P. Vautrot - 14 novembre 2013