TD-TP n°4 correction
Transcription
TD-TP n°4 correction
ING 1 - POO Java année 2015 -2016 Exercices sur les ArrayList TD-TP n°4 correction Note : dans ces exercices, vous aurez besoin de vous référer à la documentation du langage Java, en particulier la classe ArrayList et la classe Sring : • classe ArrayList • classe String Utiliser la classe ArrayList Les tableaux classiques sont disponibles en Java (comme en C++). L’API Java fournit d’autres classes permettant le stockage d’une collection d’objets, comme la classe ArrayList<>. La classe ArrayList<Type> possède 2 avantages sur le tableau classique : – elle ne requiert pas, a priori, la connaissance du nombre maximal d’éléments à mémoriser1 – elle permet la mémorisation d’objets de différentes classes dans un même tableau2 Elle propose, entre autres, les méthodes suivantes : • • • • • void add(un objet) : ajoute un objet à la collection (à la fin) boolean remove(un objet) : enlève l’objet de la collection get(indice) : renvoie l’objet de la collection situé à une certaine position (indice) boolean contains(Object o) : retourne vrai si l'objet o est présent dans la collection int size() : retourne le nombre d'objets dans la collection L’exemple suivant import java.util.ArrayList; public class Test { public static void main(String[] args){ 1 ArrayList liste = new ArrayList<>(); 1alors qu’un tableau classique requiert une taille maximale, sans possibilité d’extension : un objet de la classe ArrayList peut donc stocker un nombre "infini" d’objets (dans la limite de d’espace mémoire disponible) 2A lors qu’un tableau classique déclare le type des éléments mémorisés, il est possible dans un ArrayList de stocker des objets de type Object, il faut préciser la classe de l'objet récupéré par transtypage (changement de type forcé) 2 3 liste.add("première chaîne"); liste.add(new String("une deuxième chaîne")); 4 int i; System.out.println("Longueur de la chaîne : " + ((String) (liste.get(i))).length()); } } – ligne1 : déclare un ArrayList (collection) de chaînes de caractères – lignes 2-3 : y ajoute 2 objets chaînes de caractères ; remarquer la deuxième forme d’ajout : on instancie un objet qu’on ajoute directement à la collection ; – ligne 4 : introduit une boucle à partir de 0, et tant que l’indice est inférieur à la taille du vecteur – ligne 5 : liste.get(i) : renvoie l’élément du tableau liste à la position d’indice i (cet élément est de classe Object) – (String) liste.get(i) : l’élément récupéré est un objet de la classe String – ((String) liste.get(i)).length() : pour l’objet de la classe String, on invoque sa méthode ’length’ qui renvoie sa longueur Java propose une extension, les types génériques, qui permet de définir explicitement le type des éléments d’une collection. L’exemple ci-dessous déclare et instancie un tableau qui contiendra uniquement des objets des classes définies à la déclaration à l’instanciation : ArrayList<String> l1 = new ArrayList<String>(); //objets de classe String ArrayList<Polynome> l2 = new ArrayList<Polynome>(); //objets de classe Polynome A réaliser Créer la classe ’ArrayListTest’ et définir les opérations suivantes dans sa méthode ’main’ : 1. déclarer et instancier une collection de chaînes de caractères (un objet de la classe ArrayList<String>) 2. ajouter à la collection 5 objets chaînes de caractères 3. lister chacun des objets de la collection Compiler et tester. Analyse d'un texte Nous allons analyser un texte en le chargeant en mémoire dans une ArrayList<String>. Nous pouvons prendre par exemple quelques lignes du livre de Marcel Proust, « du côté de chez Swan » « Longtemps, je me suis couché de bonne heure. Parfois, à peine ma bougie éteinte, mes yeux se fermaient si vite que je n’avais pas le temps de me dire : « Je m’endors. » Et, une demi-heure après, la pensée qu’il était temps de chercher le sommeil m’éveillait ; je voulais poser le volume que je croyais avoir encore dans les mains et souffler ma lumière ; je n’avais pas cessé en dormant de faire des réflexions sur ce que je venais de lire, mais ces réflexions avaient pris un tour un peu particulier ; il me semblait que j’étais moi-même ce dont parlait l’ouvrage : une église, un quatuor, la rivalité de François Ier et de Charles-Quint. Cette croyance survivait pendant quelques secondes à mon réveil ; elle ne choquait pas ma raison, mais pesait comme des écailles sur mes yeux et les empêchait de se rendre compte que le bougeoir n’était pas allumé. Puis elle commençait à me devenir inintelligible, comme après la métempsycose les pensées d’une existence antérieure ; le sujet du livre se détachait de moi, j’étais libre de m’y appliquer ou non ; aussitôt je recouvrais la vue et j’étais bien étonné de trouver autour de moi une obscurité, douce et reposante pour mes yeux, mais peut-être plus encore pour mon esprit, à qui elle apparaissait comme une chose sans cause, incompréhensible, comme une chose vraiment obscure. Je me demandais quelle heure il pouvait être ; j’entendais le sifflement des trains qui, plus ou moins éloigné, comme le chant d’un oiseau dans une forêt, relevant les distances, me décrivait l’étendue de la campagne déserte où le voyageur se hâte vers la station prochaine ; et le petit chemin qu’il suit va être gravé dans son souvenir par l’excitation qu’il doit à des lieux nouveaux, à des actes inaccoutumés, à la causerie récente et aux adieux sous la lampe étrangère qui le suivent encore dans le silence de la nuit, à la douceur prochaine du retour. » Vous enregistrerez le texte sous le nom proust.txt et vous le chargerez avec le programme suivant (incomplet) ArrayList<String> allWords = new ArrayList<String>(); try { Scanner input = new Scanner(new File("proust.txt")); while (input.hasNext()) { String word = input.next(); allWords.add(word); } } catch (Exception e){} 1. 2. 3. 4. Afficher tous les mots du texte Afficher le texte dans l'ordre inverse Afficher le texte avec les mots au pluriel en CAPITALES Afficher le texte en enlevant tous les mots au pluriel. Pour simplifier l'exercice, on considérera que les mots au pluriel sont les mots se terminant par s. import java.util.ArrayList; import java.util.Scanner; import java.io.File; public class Roman { public static void main(String [] args){ ArrayList<String> allWords = new ArrayList<String>(); try { Scanner input = new Scanner(new File("proust.txt")); while (input.hasNext()){ String word = input.next(); allWords.add(word); } } catch (Exception e) {} // affichage de tous les mots du texte for(String mot : allWords) System.out.print(mot + " "); // saute deux lignes sur l'écran System.out.print("\n\n"); // affichage du texte dans l'ordre inverse for(int i = allWords.size() - 1; i >= 0; i--) System.out.print(allWords.get(i) + " "); // saute deux lignes sur l'écran System.out.print("\n\n"); // les mots au pluriel sont en majuscules // on suppose que les mots qui se terminent pas un s sont au pluriel // c'est une approximation bien sûr for(String mot : allWords) if (mot.charAt(mot.length() - 1) == 's') System.out.print(mot.toUpperCase() + " "); else System.out.print(mot + " "); // saute deux lignes sur l'écran System.out.print("\n\n"); // suppression des mots au pluriel for(String mot : allWords) if (mot.charAt(mot.length() - 1) == 's') System.out.print(" "); else System.out.print(mot + " "); // saute deux lignes sur l'écran System.out.print("\n\n"); } } Affichage à l'écran : java Roman Longtemps, je me suis couché de bonne heure. Parfois, à peine ma bougie éteinte, mes yeux se fermaient si vite que je n’avais pas le temps de me dire : « Je m’endors. » Et, une demi-heure après, la pensée qu’il était temps de chercher le sommeil m’éveillait ; je voulais poser le volume que je croyais avoir encore dans les mains et souffler ma lumière ; je n’avais pas cessé en dormant de faire des réflexions sur ce que je venais de lire, mais ces réflexions avaient pris un tour un peu particulier ; il me semblait que j’étais moi-même ce dont parlait l’ouvrage : une église, un quatuor, la rivalité de François Ier et de Charles-Quint. Cette croyance survivait pendant quelques secondes à mon réveil ; elle ne choquait pas ma raison, mais pesait comme des écailles sur mes yeux et les empêchait de se rendre compte que le bougeoir n’était pas allumé. Puis elle commençait à me devenir inintelligible, comme après la métempsycose les pensées d’une existence antérieure ; le sujet du livre se détachait de moi, j’étais libre de m’y appliquer ou non ; aussitôt je recouvrais la vue et j’étais bien étonné de trouver autour de moi une obscurité, douce et reposante pour mes yeux, mais peut-être plus encore pour mon esprit, à qui elle apparaissait comme une chose sans cause, incompréhensible, comme une chose vraiment obscure. Je me demandais quelle heure il pouvait être ; j’entendais le sifflement des trains qui, plus ou moins éloigné, comme le chant d’un oiseau dans une forêt, relevant les distances, me décrivait l’étendue de la campagne déserte où le voyageur se hâte vers la station prochaine ; et le petit chemin qu’il suit va être gravé dans son souvenir par l’excitation qu’il doit à des lieux nouveaux, à des actes inaccoutumés, à la causerie récente et aux adieux sous la lampe étrangère qui le suivent encore dans le silence de la nuit, à la douceur prochaine du retour retour du prochaine douceur la à nuit, la de silence le dans encore suivent le qui étrangère lampe la sous adieux aux et récente causerie la à inaccoutumés, actes des à nouveaux, lieux des à doit qu’il l’excitation par souvenir son dans gravé être va suit qu’il chemin petit le et ; prochaine station la vers hâte se voyageur le où déserte campagne la de l’étendue décrivait me distances, les relevant forêt, une dans oiseau d’un chant le comme éloigné, moins ou plus qui, trains des sifflement le j’entendais ; être pouvait il heure quelle demandais me Je obscure. vraiment chose une comme incompréhensible, cause, sans chose une comme apparaissait elle qui à esprit, mon pour encore plus peut-être mais yeux, mes pour reposante et douce obscurité, une moi de autour trouver de étonné bien j’étais et vue la recouvrais je aussitôt ; non ou appliquer m’y de libre j’étais moi, de détachait se livre du sujet le ; antérieure existence d’une pensées les métempsycose la après comme inintelligible, devenir me à commençait elle Puis allumé. pas n’était bougeoir le que compte rendre se de empêchait les et yeux mes sur écailles des comme pesait mais raison, ma pas choquait ne elle ; réveil mon à secondes quelques pendant survivait croyance Cette Charles-Quint. de et Ier François de rivalité la quatuor, un église, une : l’ouvrage parlait dont ce moi-même j’étais que semblait me il ; particulier peu un tour un pris avaient réflexions ces mais lire, de venais je que ce sur réflexions des faire de dormant en cessé pas n’avais je ; lumière ma souffler et mains les dans encore avoir croyais je que volume le poser voulais je ; m’éveillait sommeil le chercher de temps était qu’il pensée la après, demi-heure une Et, » m’endors. Je « : dire me de temps le pas n’avais je que vite si fermaient se yeux mes éteinte, bougie ma peine à Parfois, heure. bonne de couché suis me je Longtemps, Longtemps, je me SUIS couché de bonne heure. Parfois, à peine ma bougie éteinte, MES yeux se fermaient si vite que je N’AVAIS PAS le TEMPS de me dire : « Je m’endors. » Et, une demi-heure après, la pensée qu’il était TEMPS de chercher le sommeil m’éveillait ; je VOULAIS poser le volume que je CROYAIS avoir encore DANS LES MAINS et souffler ma lumière ; je N’AVAIS PAS cessé en dormant de faire DES RÉFLEXIONS sur ce que je VENAIS de lire, MAIS CES RÉFLEXIONS avaient PRIS un tour un peu particulier ; il me semblait que J’ÉTAIS moi-même ce dont parlait l’ouvrage : une église, un quatuor, la rivalité de FRANÇOIS Ier et de Charles-Quint. Cette croyance survivait pendant QUELQUES SECONDES à mon réveil ; elle ne choquait PAS ma raison, MAIS pesait comme DES ÉCAILLES sur MES yeux et LES empêchait de se rendre compte que le bougeoir n’était PAS allumé. PUIS elle commençait à me devenir inintelligible, comme APRÈS la métempsycose LES PENSÉES d’une existence antérieure ; le sujet du livre se détachait de moi, J’ÉTAIS libre de m’y appliquer ou non ; aussitôt je RECOUVRAIS la vue et J’ÉTAIS bien étonné de trouver autour de moi une obscurité, douce et reposante pour MES yeux, MAIS peut-être PLUS encore pour mon esprit, à qui elle apparaissait comme une chose SANS cause, incompréhensible, comme une chose vraiment obscure. Je me DEMANDAIS quelle heure il pouvait être ; J’ENTENDAIS le sifflement DES TRAINS qui, PLUS ou MOINS éloigné, comme le chant d’un oiseau DANS une forêt, relevant LES distances, me décrivait l’étendue de la campagne déserte où le voyageur se hâte VERS la station prochaine ; et le petit chemin qu’il suit va être gravé DANS son souvenir par l’excitation qu’il doit à DES lieux nouveaux, à DES ACTES inaccoutumés, à la causerie récente et aux adieux SOUS la lampe étrangère qui le suivent encore DANS le silence de la nuit, à la douceur prochaine du retour Longtemps, je me couché de bonne heure. Parfois, à peine ma bougie éteinte, yeux se fermaient si vite que je le de me dire : « Je m’endors. » Et, une demi-heure après, la pensée qu’il était de chercher le sommeil m’éveillait ; je poser le volume que je avoir encore et souffler ma lumière ; je cessé en dormant de faire sur ce que je de lire, avaient un tour un peu particulier ; il me semblait que moi-même ce dont parlait l’ouvrage : une église, un quatuor, la rivalité de Ier et de Charles-Quint. Cette croyance survivait pendant à mon réveil ; elle ne choquait ma raison, pesait comme sur yeux et empêchait de se rendre compte que le bougeoir n’était allumé. elle commençait à me devenir inintelligible, comme la métempsycose d’une existence antérieure ; le sujet du livre se détachait de moi, libre de m’y appliquer ou non ; aussitôt je la vue et bien étonné de trouver autour de moi une obscurité, douce et reposante pour yeux, peut-être encore pour mon esprit, à qui elle apparaissait comme une chose cause, incompréhensible, comme une chose vraiment obscure. Je me quelle heure il pouvait être ; le sifflement qui, ou éloigné, comme le chant d’un oiseau une forêt, relevant distances, me décrivait l’étendue de la campagne déserte où le voyageur se hâte la station prochaine ; et le petit chemin qu’il suit va être gravé son souvenir par l’excitation qu’il doit à lieux nouveaux, à inaccoutumés, à la causerie récente et aux adieux la lampe étrangère qui le suivent encore le silence de la nuit, à la douceur prochaine du retour La classe Polyline Une polyligne est une suite de segments formés par des points. Nous utiliserons la classe ArrayList afin de garder la trace des différents points formant les segments Vous aurez à écrire la classe Point, puis la classe PolyLine. Pour la classe PolyLine, il y aura deux constructeurs : • un constructeur sans paramètre ; • un constructeur qui prend en paramètre une ArrayList de points pour l'affecter directement à la PolyLine Pour les méthodes : • appendPoint pour rajouter un point par ses coordonnées, ou directement un objet de type Point • programmez également les méthodes toString() public class TestPolyLine { public static void main(String[] args) { PolyLine l1 = new PolyLine(); System.out.println(l1); // vide l1.appendPoint(new Point(1, 1)); l1.appendPoint(2, 2); l1.appendPoint(3, 3); System.out.println(l1); // (1,1)(2,2)(3,3) } } public class Point { // les attributs private int x, y; // le constructeur public Point(int x, int y){ this.x = x; this.y = y; } public String toString(){ String res = "(" + x +"," + y + ")"; return res; } } import java.util.ArrayList; public class PolyLine { // un attribut de type ArrayList private ArrayList<Point> points; // constructeur par défaut public PolyLine(){ points = new ArrayList<Point>(); } public PolyLine(ArrayList<Point> p){ points = p; } // 2 méthodes pour ajouter des points public void appendPoint(int x, int y){ points.add(new Point(x,y)); } public void appendPoint(Point p){ points.add(p); } // dans la méthode toString() de la classe PolyLine // on appelle la méthode toString de la classe Point public String toString(){ String res =""; for(Point p : points) res += p.toString() + "\n"; return res; } }