UE 2I002 (ex LI230) : éléments de programmation par objets avec Java
TD9 - ArrayList, UML
! !
!
Juliana Silva Bernardes
[email protected]
http://www.lcqb.upmc.fr/julianab/teaching/JAVA/
‣ArrayList
‣Paramètre de la méthode main
‣Diagramme UML
Sumary
ArrayList
‣ Un programme a souvent besoin de pouvoir gérer une liste d’éléments.
‣ La taille de cette liste d’éléments va varier tout au long du programme.
‣ C’est possible, mais pas très simple changer la taille d’un tableau.
‣ Java fournit les classes nécessaires pour traiter les tableaux de taille variable : ArrayList
ArrayList
‣ La classe ArrayList permet donc de construire des tableaux de taille variable.
‣ De la même manière qu’un tableau d’int, de char,de String une ArrayList contient des valeurs d’un type donné (Un object):
ArrayList<Integer> maListeInt;
ArrayList<Character> maListeChar;
ArrayList<String> maListeStr;
Declaration
Creation
maListeInt = new ArrayList<Integer>();
maListeChar = new ArrayList<Character>();
maListeStr = new ArrayList<String>();
ArrayList<Object> maListe;
5
ArrayList
int taille= maListe.size();
Utilisation
‣ Les objets se manipulent essentiellement à travers des méthodes.
‣ La méthode size() retourne la longueur d’une ArrayList
‣ Comme pour les tableaux, les cases des ArrayList sont numérotées en commençant à 0.
Type get(int i) renvoie l’entrée de la case numéro i
CHAPITRE 6. UTILISATION D’OBJETS : STRING ET ARRAYLIST6.10. CONTENU DE LA CLASSE ARRAYLIST
Le minimum vital
Les méthodes qui suivent permettent d’obtenir la même chose qu’avec un tableau normal, mais en gagnant, en plus, la possibilité d’ajouter une nouvelle case, ou de supprimer une case existante.
Dans le texte qui suit, Type correspond au type des éléments de l’ArrayList. Pour une ArrayList de String, par exemple, on remplacera Type par String
int size() : fonction qui renvoie la longueur d’une ArrayList; La fonction booléenne isEmpty permet de savoir si une liste est vide.
Type get(int i) renvoie l’entrée de la case numéro i. Comme pour les tableaux, les cases des ArrayList sont numérotées en commençant à 0. Le type de l’objet retourné est celui précisé lors de la créa-
tion de l’ArrayList.Pour nous ce sera donc String, Doubleou Integer. À partir de java 1.5, java ´n sait ˙z convertir un Integer ou un Double en int ou double. La fonction suivante permet donc de calculer la somme des éléments d’une ArrayList d’entiers :
public static int somme(ArrayList<Integer> liste) { int s=0;
for (int i= 0; i < liste.size(); i++) { s= s + liste.get(i);
}
return s;
}
add(Type element) ajoute un élément à la fin de la liste. Pour construire la liste [2,3,5, 7, 11], on écrira donc :
ArrayList<Integer> l= new ArrayList<Integer>();
l.add(2); l.add(3); l.add(5);
l.add(7); l.add(11);
Notez qu’en toute rigueur, add prend un argument du type précisé lors de la création de l’ArrayList, c’est-à-dire Integer dans notre cas. Il faudrait donc écrire :
l.add(new Integer(2));
l.add(new Integer(3));
// etc...
Cependant, pour simplifier la vie des programmeurs, java 1.5 a introduit un système de conver- sion automatique entre les types de base int, double, char, boolean et les classes correspondantes (Integer, Double, Character et Boolean.
set(int i, Type element) remplace l’ancienne valeur qui était dans la case i par element. Logique- ment, i doit être inférieure à la size() de l’ArrayList.
remove(int i) supprime l’élément qui est dans la case i;
remove(Type element) supprime la première occurrence de l’élément de valeur element2 ; si l’élé- ment est présent plusieurs fois, il ne sera enlevé qu’une seule fois. Le contenu des cases est dé- calé, et la longeur de l’ArrayList diminue de 1. Si l’élément n’est pas présent, la liste n’est pas modifiée.
2. Il y a une ambiguïté si on appelle l.remove(5) sur une ArrayList<Integer>. S’agit-il de supprimer la valeur 5, ou la valeur de la case numéro 5 ? Si on passe un int, c’est la première méthode remove qui sera appelée (on supprime l’élément qui est dans la case d’indice 5) ; si on appelle l.remove(new Integer(5), c’est la valeur 5 qui sera supprimée.
NFA031 c⃝CNAM 2012 9
ArrayList
Utilisation
add(Type element) ajoute un élément à la fin de la liste.
Pour construire la liste [2,3,5, 7, 11], on écrira donc
‣ Notez qu’en toute rigueur, add prend un argument du type précisé lors de la création de l’ArrayList, c’est-à-dire Integer dans notre cas. Il faudrait donc écrire :
Pour simplifier java 1.5 a introduit un système de conversion automatique entre les types de base int, double, … et les classes correspondantes (Integer, Double, Character et Boolean.
ArrayList<Integer> liste = new ArrayList<Integer>(); ! liste.add(2); liste.add(3); liste.add(5);
liste.add(7); liste.add(11);
liste.add(new Integer(2)); liste.add(new Integer(3)); // etc...
ArrayList
Utilisation
set(int i, Type element) remplace l’ancienne valeur qui était dans la case i par element
liste.set(0, 5)
liste [2,3,5, 7, 11], liste [5,3,5, 7, 11],
remove(int i) supprime l’élément qui est dans la case i;
liste.remove(0) liste [3,5, 7, 11],
ArrayList
public class A {
private int x = 0;
private int y = 0;
public A(int x, int y){
this.x =x;
this.y =y;
}
public String toString(){
return "x="+x+"y="+ y;
} }
import java.util.ArrayList;
public class B{
private ArrayList<A> listA;
public B(){listA = new ArrayList<A>();}
public void ajouterA(A a){listA.add(a);}
public void removeA(A a){listA.remove(a);}
public void afficherListe(){
for (int i =0; i <listA.size(); i++){
System.out.println(listA.get(i));
} }
} public class Test {
public static void main(String [] args){
B b = new B();
A a1 = new A(0,2);
A a2 = new A(2,3);
b.ajouterA(a1);
b.ajouterA(a2);
System.out.println("Liste A");
b.afficherListe();
$ java Test Liste A
x=0 y=2 x=2 y=3
ArrayList
public class A {
private int x = 0;
private int y = 0;
public A(int x, int y){
this.x =x;
this.y =y;
}
public String toString(){
return "x="+x+"y="+ y;
} }
import java.util.ArrayList;
public class B{
private ArrayList<A> listA;
public B(){listA = new ArrayList<A>();}
public void ajouterA(A a){listA.add(a);}
public void removeA(A a){listA.remove(a);}
public void afficherListe(){
for (int i =0; i <listA.size(); i++){
System.out.println(listA.get(i));
} }
} public class Test {
public static void main(String [] args){
...
b.removeA(a1);
System.out.println("Liste A apres remove " + a1);
b.afficherListe();
} }
Liste A apres remove x=0 y=2 x=2 y=3
10
Paramètre de la méthode main
‣ Depuis le début, nous utilisons systématiquement la méthode main avec un paramètre de type String[], un tableau de chaînes de caractères.
‣ Ce paramètre permet de transférer des informations entre la ligne de commande et le programme java.
>java LigneCommande un deux trois
un deux trois
public class LigneCommande{
public static void main(String[] args){
for (int i=0; i < args.length; i++){
System.out.println(args[i]);
} }
}
La tableau args dans cette exécution a trois cases.
6.7. PARAMÈTRE DE LA MÉTHODE MAIN CHAPITRE 6. UTILISATION D’OBJETS : STRING ET ARRAYLIST
La méthode compareTo fait une comparaison d’ordre selon le code unicode de chaque caractère.
Cela correspond à l’ordre alphabétique uniquement pour les caractères sans accent. Elle renvoie un entier qui est 0 en cas d’égalité, un entier positif si l’objet est plus grand que la paramètre et un entier négatif si c’est le paramètre qui est plus grand.
6.7 Paramètre de la méthode main
Depuis le début de l’année, nous utilisons systématiquement la méthode main avec un paramètre de type String[], c’est à dire un tableau de chaînes de caractères. Ce paramètre permet de trans- férer des informations entre la ligne de commande et le programme java. Prenons un exemple où le programme se contente d’afficher les valeurs passées sur la ligne de commande.
public class LigneCommande{
public static void main(String[] args){
for (int i=0; i < args.length; i++){
Terminal.ecrireStringln(args[i]);
} }
}
Voici un exemple d’exécution :
> java LigneCommande un deux trois un
deux trois
La tableau args dans cette exécution a trois cases. Sa valeur est 0 1 2
¨un¨ ¨deux¨ ¨trois¨
Notons que même si l’on passe un nombre en paramètre, celui-ci est contenu dans le tableau sous forme d’une chaîne.
> java LigneCommande un 12 56 deux un
12 56 deux
La tableaux args vaut 0 1 2 3
¨un¨ ¨12¨ ¨56¨ ¨trois¨
Si l’on veut transformer une de ces chaînes en un entier, il faut utiliser une fonction de conversion.
6.8 Conversion entre chaînes et autres types
Il est parfois utile de convertir une chaîne de caractère en une valeur d’un autre type. Par exemple,
on peut vouloir transformer une chaîne qui ne contient que des chiffres en un nombre entier. Pour
réaliser la conversion, il faut utiliser la méthode Integer.parseInt et lui donner en paramètre la
chaîne à convertir.
Diagramme UML
# $PSSFTQPOEBODF 6.-+BWB
# "HSÏHBUJPO FU DPNQPTJUJPO
%FVY TPVTUZQFT EBTTPDJBUJPOT QFSNFUUFOU EF QSÏDJTFS VO TFOT QBSUJDVMJFS Ë DFT SFMBUJPOT MBHSÏHBUJPO FU MB DPNQPTJUJPO &MMFT QFVWFOU ÏHBMFNFOU ÐUSF EJSJHÏFT
1 *
A B
1 *
A B
1 *
A B
1 *
A B
'ĶĴłĿIJ #ŝŜ o &YFNQMFT EF DPNQPTJUJPOT FU EBHSÏHBUJPOT
-BHSÏHBUJPO FTU VOF BTTPDJBUJPO BWFD SFMBUJPO EF TVCPSEJOBUJPO TPVWFOU OPNNÏF
SFQSÏTFOUÏF QBS VO USBJU SFMJBOU MFT EFVY DMBTTFT FU EPOU MPSJHJOF TF EJTUJOHVF EF MBVUSF FYUSÏNJUÏ MB DMBTTF TVCPSEPOOÏF QBS VO
MPTBOHF DSFVY 6OF EFT DMBTTFT wSFHSPVQFw EBVUSFT DMBTTFT 0O QFVUEJSF RVF MPCKFU VUJMJTF PV QPTTÒEF VOF JOTUBODF EF MB DMBTTF
-B
DPNQPTJUJPOFTU VOF BTTPDJBUJPO MJBOU MF DZDMF EF WJF EFT EFVY DMBTTFT DPODFSOÏFT 6OF BT TPDJBUJPO EF DPNQPTJUJPO TJOUFSQSÒUF DPNNF VOF DMBTTF FTU DPNQPTÏF EF VO PV QMVTJFVST ÏMÏNFOU EF MBVUSF DMBTTF &MMF FTU SFQSÏTFOUÏF QBS VO USBJU SFMJBOU MFT EFVY DMBTTFT FU EPOU MPSJHJOF TF EJT UJOHVF EF MBVUSF FYUSÏNJUÏ MB DMBTTF DPNQPTBOU QBS VO
MPTBOHF QMFJO 0O QFVU EJSF RVF MPCKFUFTU DPNQPTÏ JOTUBODF EF MB DMBTTF FU EPOD TJ MPCKFU EF UZQF FTU EÏUSVJU MFT PCKFUT EF UZQF RVJ MF DPNQPTFOU TPOU ÏHBMFNFOU EÏUSVJU $F TFSB ÏHBMFNFOU TPVWFOU MFT PCKFUT EF UZQF RVJ DSÏFSPOU MFT PCKFUT EF UZQF
# $PSSFTQPOEBODF 6.-+BWB
+BWB QFSNFU EF QSPHSBNNFS UPVU NPEÒMF TPVT GPSNF EF EJBHSBNNF EF DMBTTF 6.- UFM RVF QSÏTFOUÏ DJEFTTVT 7PJDJ RVFMRVFT FYFNQMFT EF DPSSFTQPOEBODF FOUSF MF NPEÒMF 6.- FU MF DPEBHF +BWB
# $MBTTFT FU NFNCSFT
+ calculerDureePret() : int + getAge() : int
+ surnom : String - nom : String - prenom : String
# dateNaissance : Date Personne
# $MBTTFT BCTUSBJUFT
"OOFYF # %JBHSBNNF EF DMBTTFT 6.-
+ calculerDureePret() : int + setAgeMajorite(a : int) + getAge() : int
+ surnom : String - nom : String - prenom : String
# dateNaissance : Date - ageMajorite : int = 18
Personne
# *OUFSGBDFT
+ afficher()
<<interface>>
IAffichable
# )ÏSJUBHF
- nom : String Personne
- iD : int
Adherent
# 3ÏBMJTBUJPO
+ afficher()
<<interface>>
IAffichable
+ imprimer()
<<interface>>
IImprimable
+ afficher() + imprimer() - nom : String - fichier : File
Image
# "TTPDJBUJPOT
A1 B1
Diagramme UML
public abstract class IAffichable{
public abstract void afficher();
}
"OOFYF # %JBHSBNNF EF DMBTTFT 6.-
+ calculerDureePret() : int + setAgeMajorite(a : int) + getAge() : int
+ surnom : String - nom : String
- prenom : String
# dateNaissance : Date - ageMajorite : int = 18
Personne
# *OUFSGBDFT
+ afficher()
<<interface>>
IAffichable
# )ÏSJUBHF
- nom : String Personne
- iD : int
Adherent
# 3ÏBMJTBUJPO
+ afficher()
<<interface>>
IAffichable
+ imprimer()
<<interface>>
IImprimable
+ afficher() + imprimer() - nom : String - fichier : File
Image
# "TTPDJBUJPOT
A1 B1
<<abstract>>
Class abstract
Diagramme UML
public abstract class IAffichable{
public abstract void afficher();
}
"OOFYF # %JBHSBNNF EF DMBTTFT 6.-
+ calculerDureePret() : int + setAgeMajorite(a : int) + getAge() : int
+ surnom : String - nom : String
- prenom : String
# dateNaissance : Date - ageMajorite : int = 18
Personne
# *OUFSGBDFT
+ afficher()
<<interface>>
IAffichable
# )ÏSJUBHF
- nom : String Personne
- iD : int
Adherent
# 3ÏBMJTBUJPO
+ afficher()
<<interface>>
IAffichable
+ imprimer()
<<interface>>
IImprimable
+ afficher() + imprimer() - nom : String - fichier : File
Image
# "TTPDJBUJPOT
A1 B1
<<abstract>>
Class abstract
"OOFYF # %JBHSBNNF EF DMBTTFT 6.-
+ calculerDureePret() : int + setAgeMajorite(a : int) + getAge() : int
+ surnom : String - nom : String
- prenom : String
# dateNaissance : Date - ageMajorite : int = 18
Personne
# *OUFSGBDFT
+ afficher()
<<interface>>
IAffichable
# )ÏSJUBHF
- nom : String Personne
- iD : int
Adherent
# 3ÏBMJTBUJPO
+ afficher()
<<interface>>
IAffichable
+ imprimer()
<<interface>>
IImprimable
+ afficher() + imprimer() - nom : String - fichier : File
Image
# "TTPDJBUJPOT
A1 B1
Diagramme UML
"OOFYF # %JBHSBNNF EF DMBTTFT 6.-
+ calculerDureePret() : int + setAgeMajorite(a : int) + getAge() : int
+ surnom : String - nom : String
- prenom : String
# dateNaissance : Date - ageMajorite : int = 18
Personne
# *OUFSGBDFT
+ afficher()
<<interface>>
IAffichable
# )ÏSJUBHF
- nom : String Personne
- iD : int
Adherent
# 3ÏBMJTBUJPO
+ afficher()
<<interface>>
IAffichable
+ imprimer()
<<interface>>
IImprimable
+ afficher() + imprimer() - nom : String - fichier : File
Image
# "TTPDJBUJPOT
A1 B1
# $PSSFTQPOEBODF 6.-+BWB
A2 * B2
Homme
Femme 0..1
0..1
mari
epouse
Personne 1 chef 0..*
subordonne
Diagramme UML
# $PSSFTQPOEBODF 6.-+BWB
A2 * B2
Homme
Femme 0..1
0..1
mari
epouse
Personne 1 chef 0..*
subordonne
Diagramme UML
# $PSSFTQPOEBODF 6.-+BWB
A2 * B2
Homme
Femme 0..1
0..1
mari
epouse
Personne 1 chef 0..*
subordonne
Diagramme UML
Composition et Aggregation
‣ La composition et Aggregation peuvent être vue comme une relation “fait partie de”
‣ Composition, si un objet B fait partie d’un objet A alors B ne peut pas exister sans A
Piece murs
‣ Aggregation peut etre partager entre plusieurs classes
‣ Composition est exclusive
‣ Aggregation, si un objet B fait partie d’un objet A alors B peut exister sans A et peut etre associé à C.
Personne cerveux