FMIN110- GMIN327 Tableaux (suite) et ArrayList 2014
Rappels Tableau : colleccon de valeurs d un même type ordonnées et indexées Type : primicf (int, char,..) ou Classe (String, Appt,..) DéclaraCon d un tableau <type> [] ident; Exemples : int t[]; Appt t[];
CréaCon d un tableau new int [4]; new Appt [5]; Rappels La longueur du tableau ne peut plus être modifiée Les cases du tableau sont indexées de 0 à longueur- 1 La longueur du tableau est donnée par la pseudo- variable length Appt tab [] = new Appt [6]; System.out.println(«longueur tableau =» + tab.length); Affichera à l écran longueur du tableau = 6
Polymorphisme et tableaux
La classe AgenceImmobiliere public class AgenceImmo { private String nomagence; /* les appartements gérés sont stockés dans un tableau de taille max fixe qui sera donné lors de la construccon */ private Appartement[] appartgeres; /* le nombre d appartements gérés limité par un max nbapparts < taille de appartgeres */ private int nbappts;
Un constructeur Le constructeur assure que le tableau est alloué en mémoire public AgenceImmo(String nomagence, int nbmax) { this.nomagence = nomagence; this.nbappts = 0; this.appartgeres = new Appartement[nbMax]; nbappts = 0 appartgeres.lenght - 1 = nbmax - 1
L ajout d un appartement public void add(appartement a){ if (this.nbappts < this.appartgeres.length) { // ajout à la fin du tableau appartgeres[nbappts]=a; nbappts+=1; else System.out.println( "nb max d'apparts aneint"); 0 nbappts appartgeres.lenght - 1 = nbmax - 1 0 nbappts appartgeres.lenght - 1 = nbmax - 1
Rappels / répéccves Parcours complet avec compteur public void afficheadresses() { for (int i = 0 ; i < appartgeres.nbappts ; i++) System.out.println( appartement + i + adresse + appartgeres[i].getadresse()); Parcours par un itérateur public void afficheadresses() { for (Appt a : appartgeres) If (a!= null) System.out.println( adresse + a.getadresse());
Rappels / répéccves Parcours contrôlé par une condicon public void afficheadresse()){ int i = 0; while (i < appartgeres.nbappts) { System.out.println( appartement + i + adresse + i+ appartgeres[i].getadresse()); i++; Parcours contrôlé par une condicon (si tableau non vide) public void afficheadresse() { int i = 0; do { System.out.println( appartement + i + adresse + appartgeres[i].getadresse()); i++; while (i< appartgeres.nbappts) ;
La somme des loyers de l agence public double sommeloyers() { double s=0; for(int i = 0; I < nbappts; i++) s+= this.appartgeres[i].loyer(); return s;
La classe ProgAppartement public class ProgAppartement { public stacc void main(string[] args) { AgenceImmo agence = new AgenceImmo("La belle maison",10); Appartement a1 = new AppartementLuxe("rue Nestor", 150, 1870, 6, "Arceaux"); Appartement a2 = new AppartementNormal("rue des vignes", 50, 1970, 3, 2); agence.add(a1); agence.add(a2); System.out.println(agence.sommeLoyers());
agence la belle maison 10 0 nbappts appartgeres.lenght - 1 = nbmax - 1 "rue Nestor" 150 1870 6 "Arceaux" adresse superficie annéeconstruccon nbrepièces quarcer "rue des vignes" 50 1970 3 2 adresse superficie annéeconstruccon nbrepièces nbrnuisances APPTLUXE APPTSTANDARD a1 a2
Analyse de la situacon Le type stacque des appartements gérés dans le tableau : Appartement Les objets stockés dans le tableau sont des instances d AppartementDeLuxe ou d AppartementStandard. La méthode sommeloyers : Chaque élément du tableau reçoit le message loyer() dans : s+= this.appartgeres[i].loyer();
Polymorphisme et tableaux public double loyer() {return valeurlocahvebase()*coeff(); public double valeurlocahvebase() {return superficie* 5*(1+nbPieces/10.0); public double coeff() { return 1.1; public double coeff() {return 1-0.1*nbNuisances;
Polymorphisme A la compilacon (phase stacque) : le compilateur vérifie que les méthodes loyer, valeurlocacve et coeff existent pour le type stacque Appartement A l exécucon (phase dynamique) l interprète choisit les méthodes suivant les types dynamiques (new) (en cas de redéfinicon)
s+= this.appartgeres[0].loyer(); this.appartgeres[0] est un appartement de luxe public double loyer() {return valeurlocahvebase()*coeff(); public double valeurlocahvebase() {return superficie* 5*(1+nbPieces/10.0); public double coeff() { return 1.1; public double coeff() {return 1-0.1*nbNuisances;
s+= this.appartgeres[1].loyer(); this.appartgeres[1] est un appartement normal public double loyer() {return valeurlocahvebase()*coeff(); public double valeurlocahvebase() {return superficie* 5*(1+nbPieces/10.0); public double coeff() { return 1.1; public double coeff() {return 1-0.1*nbNuisances;
La belle maison Adresse rue Nestor année construccon = 1870 superficie = 150.0 nb pieces = 6 valeur locacve = 1200.0 coefficient moderateur = 1.1 loyer = 1320.0 quarcer Arceaux L exécucon Adresse rue des vignes année construccon = 1970 superficie = 50.0 nb pieces = 3 valeur locacve = 325.0 coefficient moderateur = 0.8 loyer = 260.0 Nombre de nuisances 2.0 Somme des loyers = 1580.0
La classe Arrays Des uclitaires pour trier, copier une parce d un tableau, comparer, etc. Des méthodes de classe (stacc) import java.uhl.arrays; public class ProgArrays{ public stahc void main(string[] args) { int t [] = new int[] {12,4,17,5,3,6; System.out.println(Arrays.toString(t)); Arrays.sort(t); System.out.println(Arrays.toString(t)); int e []= Arrays.copyOf(t,3); System.out.println(Arrays.toString(e)); int f []= Arrays.copyOfRange(t,1,4); System.out.println(Arrays.toString(f)); Arrays.fill(t,4); System.out.println(Arrays.toString(t));
L exécucon public stahc void main(string[] args) { int t [] = new int[] {12,4,17,5,3,6; System.out.println(Arrays.toString(t)); [12, 4, 17, 5, 3, 6] Arrays.sort(t); System.out.println(Arrays.toString(t)); [3, 4, 5, 6, 12, 17] int e []= Arrays.copyOf(t,3); System.out.println(Arrays.toString(e)); [3, 4, 5] int f []= Arrays.copyOfRange(t,1,4); System.out.println(Arrays.toString(f)); [4, 5, 6] Arrays.fill(t,4); System.out.println(Arrays.toString(t)); [4, 4, 4, 4, 4, 4]
La classe ArrayList ArrayList <type> où type spécifie le type d objets stockés dans le tableau Le tableau est dynamique Constructeur le plus simple public ArrayList <type>() AnenCon : ne pas oublier import java.uhl.arraylist; Besoin de synchronisacon, ucliser Vector
La classe ArrayList : quelques méthodes public int size() : retourne le nombre d éléments de la liste public boolean add(<type> e) ajoute e à la fin de la liste (retourne true ) public void add(int index, <type> element) : insère element à la posicon précisée de la liste public <type> get(int index) retourne l élement à la posicon spécifiée public <type> set(int index, <type> e) remplace l élément à la posicon index par l élément e.
La classe ArrayList <type> public boolean remove(<type> e) recre la première occurrence de l élément e. Si la liste ne concent pas e, le tableau est inchangé. Retourne true si le tableau a été modifié. public <type> remove(int index) recre l élément à la posicon spécifiée. Déplace les élements suivants vers la gauche. public boolean removeall( CollecCon <type> c) recre tous les éléments de la colleccon c du tableau. public void clear() recre tous les éléments du tableau public boolean contains(<type> e) retourne true si le tableau concent l élément e.
La classe agence immobilière import java.uhl.arraylist; public class AgenceImmo { private String nomagence; private ArrayList <Appartement> appartgeres; On remarque qu il n est plus ucle : de maintenir un nombre d appartement gérés (size()) ni un nombre max (la structure s adapte dynamiquement).
Un constructeur public AgenceImmo(String nomagence) { this.nomagence = nomagence; this.appartgeres = new ArrayList <Appartement> (); Remarques : pas de ArrayList passée en paramètre (gérée en interne) variante à parcr de JAVA 1.7 new ArrayList <> () le type est déduit mais éviter new ArrayList () car les types ne seront pas vérifiés
Ajout d un appartement public void add(appartement a) { if (! appartgeres.contains(a)) appartgeres.add(a); Remarques : pas de test de taille (dynamique) pas de manipulacon d indice (géré en interne)
La méthode tostring() pour une ArrayList La méthode tostring() d une ArrayList retourne [ puis les résultats de la méthode tostring() sur chaque élément du tableau (séparés par des, ) puis ] Dans AgenceImmo : public String tostring(){ String st = this.nomagence+"\n "+this.appartgeres.tostring(); return st;
La méthode tostring() pour une ArrayList Si tostring() d Appartement retourne seulement : l adresse pour tous les appartements puis le quarcer pour les appartements de luxe le nombre de nuisances pour les normaux System.out.prinltn(agence) [rue Nestor Arceaux, rue des vignes - 2]
La somme des loyers de l agence immobiliere public double sommeloyers() { double s=0; for (Appartement a: this.appartgeres) s+= a.loyer(); return s;
La classe ProgAppartement import java.uhl.arraylist; public class ProgAppartement { public stahc void main(string[] args) { AgenceImmo agence = new AgenceImmo("La belle maison",5); Appartement a1 = new AppartementLuxe ("rue Nestor", 150, 1870, 6, "Arceaux"); Appartement a2 = new AppartementNormal ("rue des vignes", 50, 1970, 3, 2); agence.add(a1); agence.add(a2); System.out.println("Somme des loyers = "+ agence.sommeloyers()); System.out.println(agence);
Comparaison tableau ArrayList <type> DéclaraCon Appartement[] t; ArrayList <Appartement> t ; CréaCon t = new Appartement[nbMax] t = new ArrayList <Appartement> () ou new ArrayList <> () Java 1.7 taille Figée une fois fixée extensible longueur t.length t.size() Accès à un élément Parcours du tableau de 0 à t.length- 1 t[i] ajout t[i] = a pour i < t.length t.add(a) retrait On écrase la valeur t[i] t.remove(a) t.get(i), t.set(i,e), t.contains(e) i compris entre 0 et size()- 1
Exercice d applicacon Ecrire une méthode de recherche d un appartement dont l adresse est connue, pour la classe AgenceImmo : implémentée avec un tableau interne implémentée avec une ArrayList