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;
}
}