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