Tableaux et Collections F. Mallet Frederic.Mallet@unice.fr http://deptinfo.unice.fr/~fmallet/java/gse.html 2011/2012 F. Mallet 4-1
Réutilisation Types génériques Structures de contrôle for-each Structures de données Tableaux Collections ArrayList Tableaux et collections Chapitre IV Objectifs 2011/2012 F. Mallet 2
Ensemble ordonnés d éléments Tableaux Accès (lecture/écriture) en temps constant Type unique choisi à la déclaration Type primitif Classe (polymorphisme) Longueur statique choisie à la construction Les tableaux sont des objets Tableaux de tableaux ( matrice) 2011/2012 F. Mallet 3
Tableaux : syntaxe Déclaration int[] t1; ou int t1[]; Compteur[] t2; Construction du tableau t1 = new int[10]; t2 = new Compteur[5]; Affectation de tableaux Compteur[] t3 = t2; Longueur t3.length 5 (référence) (pas de ses éléments) (pas de copie globale) (statique) 2011/2012 F. Mallet 4
Lecture ou écriture t1[0] = 24; Tableaux et collections t2[1] = new Compteur(); Indice: accès aux éléments t2[0] = new Compteur(); t2[2] = new CompteurModulo(12); t2[4] = t2[2]; // copie de référence 2011/2012 F. Mallet 5
ArrayIndexOutOfBoundsException A chaque accès (lecture/écriture) Les bornes sont vérifiées => Pas d accès non autorisé à la mémoire Example int[] t = new int[5]; t[-1] => ArrayIndexOutOfBoundsException -1<0 t[5] => ArrayIndexOutOfBoundsException 5>=5 2011/2012 F. Mallet 6
Compteur[] tab; Itération: for Tableaux et collections Parcourir les éléments for (int i = 0; i<tab.length; i++) tab[i].incrementer(); Itération: for-each for (Compteur c : tab) c.incrementer(); 2011/2012 F. Mallet 7
Tableaux à plusieurs dimensions Déclaration int[][] t4; // tableau de tableaux d entiers Construction du tableau t4 = new int[5][]; // 5 tableaux d entiers Utilisation t4[0] = t1; t4[1] = new int[3]; // copie de références Remarque t4.length 5 t4[0].length 10 t4[1].length 3 2011/2012 F. Mallet 8
Paramètres variables Operation binaire interface IOpBinaire{ int calcule(int v1, int v2); class Addition implements IOpBinaire { int calcule(int v1, int v2){ return v1+v2; Opération N-aire interface IOpNaire{ int calcule(int[] valeurs); class Add implements IOpNaire { int calcule(int[] valeurs){ int somme = 0; for(int v : valeurs) somme += v; return somme; new Addition().calcule(5, 12); new Add().calcule(new int[]{5,12); 2011/2012 F. Mallet 9
Paramètres variables Operation binaire interface IOpBinaire{ int calcule(int v1, int v2); class Addition implements IOpBinaire { int calcule(int v1, int v2){ return v1+v2; Opération N-aire interface IOpNaire{ int calcule(int valeurs); class Add implements IOpNaire { int calcule(int valeurs){ int somme = 0; for(int v : valeurs) somme += v; return somme; new Addition().calcule(5, 12); new Add().calcule(5,12,40,-5); 2011/2012 F. Mallet 10
Classe utilitaire : java.util.arrays Manipulations courantes de tableaux Recherche: Copy: Comparaison: Remplissage: Trie: Affichage: int binarysearch(t[] tab, T val); T[] copyof(t[] tab, int newlength); boolean equals(t[] t1, T[] t2); void fill(t[] tab, T val); void sort(t[] tab) String tostring(t[] tab); Remplacer T selon le type boolean, char, byte, short, int, long, float, double, Object 2011/2012 F. Mallet 11
java.util.collection Groupe d éléments capacité extensible taille dynamique Les collections sont des objets Différentes interfaces Ensemble Liste Ensemble ordonné, accès par indice java.util.set java.util.list Files (double sens) Table association (clé/valeur) java.util.queue (Deque) java.util.map 2011/2012 F. Mallet 12
Classes concrètes Ensemble java.util.set java.util.sortedset Table de hachage : java.util.hashset Arbre balancé : java.util.treeset Hachage + liste chaînée : java.util.linkedhashset Liste java.util.list Tableau à capacité variable : java.util.arraylist Liste chaînée : java.util.linkedlist 2011/2012 F. Mallet 13
Classes concrètes File java.util.queue java.util.deque Tableau à capacité variable : java.util.arraydeque Liste chaînée : java.util.linkedlist Table d association java.util.map,java.util.sortedmap Table de hachage : java.util.hashmap Arbre balancé : java.util.treemap Hachage + liste chaînée : java.util.linkedhashmap 2011/2012 F. Mallet 14
Collections : syntaxe Déclaration java.util.arraylist liste1; (référence) Construction d une liste t1 = new java.util.arraylist(); Affectation de collections java.util.arraylist liste2 = liste1; (pas de ses éléments) (pas de copie globale) Taille liste1.size() 0 (dynamique) 2011/2012 F. Mallet 15
Ajout liste1.add(new Compteur()); liste1.add(new ComplexeCartesien(0,1)); Opérations Accès en lecture (par indice) Object o1 = liste1.get(0); ((Compteur)o1).incrementer(); Object o2 = liste1.get(1); ((Compteur)o2).incrementer(); ClassCastException Accès en écriture (par indice) liste1.set(0, new CompteurRapide(o1, 10)); liste1.set(1, o1); 2011/2012 F. Mallet 16
Classes regroupées par thèmes java.util, java.awt, java.lang, La directive import Avant le bloc de déclaration de classe Example: import java.util.arraylist; class Toto { ArrayList liste1 = new ArrayList(); Paquetage 2011/2012 F. Mallet 17
Collections génériques : syntaxe Déclaration ArrayList<ICompteur> compteurs; (référence) Construction compteurs = new ArrayList<ICompteur>(); Ajout compteurs.add(new Compteur()); compteurs.add(new ComplexeCartesien(0,1)); Accès en lecture (par indice) ICompteur c1 = compteurs.get(0); c1.incrementer(); ICompteur c 2011/2012 F. Mallet 18
Parcours des éléments ArrayList compteurs = new ArrayList(); Par indice (seulement pour les listes) for(int i = 0; i<compteurs.size(); i++) { ICompteur c = (ICompteur)compteurs.get(i); c.incrementer(); For-each : itérateurs for(object c : compteurs) { ((ICompteur)c).incrementer(); 2011/2012 F. Mallet 19
ArrayList<ICompteur> compteurs; Parcours des éléments Par indice (seulement pour les listes) for(int i = 0; i<compteurs.size(); i++) { ICompteur c = compteurs.get(i); c.incrementer(); For-each : itérateurs for(icompteur c : compteurs) { c.incrementer(); 2011/2012 F. Mallet 20
Parcours des éléments Interface java.util.iterator interface Iterator<T> { boolean hasnext(); T next(); void remove(); Usage Collection<ICompteur> compteurs = ; Iterator<ICompteur> it = compteurs.iterator(); while(it.hasnext()) { ICompteur c = it.next(); c.incrementer(); 2011/2012 F. Mallet 21
Avec les types primitifs? ArrayList<int> listeentiers; ArrayList<Integer> listeentiers; Ajout d éléments listeentiers.add(new Integer(12)); listeentiers.add(12); Lecture Integer Auto (un)boxing int v = listeentiers.get(0).intvalue(); int v = listeentiers.get(0); Auto boxing Auto unboxing 2011/2012 F. Mallet 22
Classe utilitaire : java.util.collections Manipulations courantes de tableaux Recherche: int binarysearch(list<t> li, T val); T min(collection<t> c); Copy: T max(collection<t> c); void copy(list<t> l1, List<T> l2); Comparaison: boolean disjoint(list<t> l1, List<T> l2); Remplissage: void fill(list<t> li, T val); Divers: Trie: void replaceall(list<t> li, T old, T new); void reverse(list<t> li); void rotate(list<t> li, int distance); void shuffle(list<t> li); void sort(list<t> li) 2011/2012 F. Mallet 23
Collections: JDK 1.1 JDK 1.1 java.util.vector => java.util.arraylist java.util.enumeration => java.util.iterator java.util.hashtable => java.util.hashmap Thread-safe List<T> Collections.synchronizedList(List<T> l) Types génériques Java 5(JDK 1.5) 2011/2012 F. Mallet 24