! ! ! 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/ Sumary ‣ArrayList ‣Paramètre de la méthode main ‣Diagramme UML 2 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 3 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): Declaration ArrayList<Integer> maListeInt; ArrayList<String> maListeStr; ArrayList<Character> maListeChar; ArrayList<Object> maListe; Creation maListeInt = new ArrayList<Integer>(); maListeChar = new ArrayList<Character>(); maListeStr = new ArrayList<String>(); 4 ArrayList CHAPITRE 6. Utilisation UTILISATION D’OBJETS : STRING 6.10.ET CONTENU ARRAYLIST DE LA CLASSE ARRAYLIST Le objets minimum sevital manipulent essentiellement à travers des méthodes. ‣ Les Les méthodes qui suiventretourne permettent la d’obtenir la même chose qu’avec un tableau normal, mais en size() longueur d’une ArrayList ‣ La méthode 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 int taille= maListe.size(); 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. pour les tableaux, les cases des i. ArrayList sont numérotées en ‣ Comme Type get(int i) renvoie l’entrée de la case numéro Comme pour les tableaux, les cases des ArrayList commençant à 0. en commençant à 0. Le type de l’objet retourné est celui précisé lors de la créasont numérotées Type tion de l’ArrayList. Pour nous ce sera donc String, Double ou Integer. À partir de java 1.5, java ń sait ż convertir Integer un Double get(int i) renvoie l’entréeunde la caseou numéro i 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 5 écrira donc : 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 ArrayList<Integer> liste = new ArrayList<Integer>(); ! liste.add(2); liste.add(3); liste.add(5); liste.add(7); liste.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 : liste.add(new Integer(2)); liste.add(new Integer(3)); // etc... 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. 6 ArrayList Utilisation set(int i, Type element) remplace l’ancienne valeur qui était dans la case i par element liste [2,3,5, 7, 11], liste.set(0, 5) 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], 7 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(); 8 $ 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 9 tring[], c’est à dire un tableau de chaînes de caractères. Ce paramètre permet de transinformations entre la ligne de commande et le programme java. Prenons un exemple où le me se contente d’afficher les valeurs passées sur la ligne de commande. Paramètre de la méthode main ‣ Depuis le début, nous utilisons systématiquement la méthode main avec un ss LigneCommande{ c staticparamètre void main(String[] args){ de type String[], un tableau de chaînes de caractères. or (int i=0; i < args.length; i++){ ‣ Ce paramètre permet de transférer des informations entre la ligne de commande et Terminal.ecrireStringln(args[i]); le programme java. public class LigneCommande{ public static void main(String[] args){ un exemple d’exécution : for (int i=0; i < args.length; i++){ System.out.println(args[i]); LigneCommande un deux trois } } } >java LigneCommande un deux trois un deux trois 0 1 2 ¨un¨ ¨deux¨ ¨trois¨ ns que même si l’on passe un nombre en paramètre, celui-ci est contenu dans le tableau sous ne chaîne. La tableau cette aexécution a trois cases.est bleau args dans args cettedans exécution trois cases. Sa valeur LigneCommande un 12 56 deux 10 +BWB QFSNFU EF QSPHSBNNFS UPVU NPEÒMF TPVT GPSNF EF EJBHSBNNF EF DMBTTF 6.- UFM RVF ÏTFOUÏ DJEFTTVT 7PJDJ RVFMRVFT FYFNQMFT EF DPSSFTQPOEBODF FOUSF MF NPEÒMF 6.- FU MF DPEBHF WB Diagramme UML $MBTTFT FU NFNCSFT Personne + surnom : String - nom : String - prenom : String # dateNaissance : Date + calculerDureePret() : int + getAge() : int "OOFYF # %JBHSBNNF EF DMBTTFT 6.- $MBTTFT BCTUSBJUFT Personne + surnom : String - nom : String - prenom : String # dateNaissance : Date - ageMajorite : int = 18 + calculerDureePret() : int + setAgeMajorite(a : int) + getAge() : int # *OUFSGBDFT <<interface>> IAffichable Diagramme UML *OUFSGBDFT Class abstract <<interface>> <<abstract>> IAffichable + afficher() )ÏSJUBHF Personne - nom : String Adherent - iD : int public abstract class IAffichable{ public abstract void afficher(); } + setAgeMajorite(a : int) + getAge() : int Diagramme UML *OUFSGBDFT Class abstract *OUFSGBDFT <<interface>> <<abstract>> <<interface>> IAffichable IAffichable + afficher() + afficher() )ÏSJUBHF )ÏSJUBHF Personne Personne - nom: String : String - nom Adherent Adherent - iD : int - iD : int 3ÏBMJTBUJPO public abstract class IAffichable{ public abstract void afficher(); } Diagramme UML "TTPDJBUJPOT A1 B1 # $PSSFTQPOEBODF 6.-+ * A2 B2 Homme 0..1 mari 0..1 epouse Femme A2 B2 Diagramme UML Homme 0..1 mari 0..1 epouse Femme Personne 1 chef 0..* subordonne Femme Personne Diagramme UML 1 chef 0..* subordonne Diagramme UML Composition et Aggregation ‣ La composition et Aggregation peuvent être vue comme une relation “fait partie de” ‣ 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. Piece murs ‣ Composition, si un objet B fait partie d’un objet A alors B ne peut pas exister sans A Personne cerveux