Tableaux et Collections
Transcription
Tableaux et Collections
Tableaux et Collections F. Mallet [email protected] http://deptinfo.unice.fr/~fmallet/java/gse.html 2011/2012 F. Mallet 4-1 Tableaux et collections Chapitre IV – Objectifs Réutilisation Types génériques Structures de contrôle for-each Structures de données Tableaux Collections • ArrayList 2011/2012 F. Mallet 2 Tableaux et collections Tableaux Ensemble ordonnés d’éléments 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 et collections Tableaux : syntaxe Déclaration int[] t1; ou Compteur[] t2; (référence) int t1[]; Construction du tableau (pas de ses éléments) t1 = new int[10]; t2 = new Compteur[5]; Affectation de tableaux (pas de copie globale) Compteur[] t3 = t2; Longueur (statique) t3.length → 5 2011/2012 F. Mallet 4 Tableaux et collections Indice: accès aux éléments Lecture ou écriture t1[0] = 24; t2[0] = new Compteur(); t2[1] = new Compteur(); t2[2] = new CompteurModulo(12); // copie de référence t2[4] = t2[2]; 2011/2012 F. Mallet 5 Tableaux et collections 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 Tableaux et collections Parcourir les éléments Compteur[] tab; Itération: for 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 et collections Tableaux à plusieurs dimensions Déclaration int[][] t4; // tableau de tableaux d’entiers Construction du tableau // 5 tableaux d’entiers t4 = new int[5][]; Utilisation t4[0] = t1; t4[1] = new int[3]; // copie de références Remarque t4.length → 5 t4[0].length → 10 2011/2012 t4[1].length → 3 F. Mallet 8 Tableaux et collections Paramètres variables Operation binaire Opération N-aire interface IOpBinaire{ int calcule(int v1, int v2); } class Addition implements IOpBinaire { int calcule(int v1, int v2){ return v1+v2; } } 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 Tableaux et collections Paramètres variables Operation binaire Opération N-aire interface IOpBinaire{ int calcule(int v1, int v2); } class Addition implements IOpBinaire { int calcule(int v1, int v2){ return v1+v2; } } 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 Tableaux et collections 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 Tableaux et collections java.util.Collection Groupe d’éléments capacité extensible taille dynamique Les collections sont des objets Différentes interfaces Ensemble Liste java.util.Set java.util.List • Ensemble ordonné, accès par indice Files (double sens) java.util.Queue Table association (clé/valeur) 2011/2012 F. Mallet (Deque) java.util.Map 12 Tableaux et collections Classes concrètes Ensemble java.util.Set Table de hachage : Arbre balancé : java.util.SortedSet java.util.HashSet 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 Tableaux et collections 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 : Arbre balancé : java.util.HashMap java.util.TreeMap Hachage + liste chaînée : 2011/2012 java.util.LinkedHashMap F. Mallet 14 Tableaux et collections Collections : syntaxe Déclaration (référence) java.util.ArrayList liste1; Construction d’une liste (pas de ses éléments) t1 = new java.util.ArrayList(); Affectation de collections (pas de copie globale) java.util.ArrayList liste2 = liste1; Taille (dynamique) liste1.size() → 0 2011/2012 F. Mallet 15 Tableaux et collections Opérations Ajout liste1.add(new Compteur()); liste1.add(new ComplexeCartesien(0,1)); 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 Tableaux et collections Paquetage 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(); } 2011/2012 F. Mallet 17 Tableaux et collections Collections génériques : syntaxe Déclaration (référence) ArrayList<ICompteur> compteurs; Construction compteurs = new ArrayList<ICompteur>(); Ajout ICompteur c compteurs.add(new Compteur()); compteurs.add(new ComplexeCartesien(0,1)); Accès en lecture (par indice) ICompteur c1 = compteurs.get(0); c1.incrementer(); 2011/2012 F. Mallet 18 Tableaux et collections 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 Tableaux et collections Parcours des éléments ArrayList<ICompteur> compteurs; … 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 Tableaux et collections 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 Tableaux et collections Auto (un)boxing Avec les types primitifs ? ArrayList<int> listeEntiers; ArrayList<Integer> listeEntiers; Ajout d’éléments listeEntiers.add(new Integer(12)); listeEntiers.add(12); Lecture Auto boxing Integer int v = listeEntiers.get(0).intValue(); int v = listeEntiers.get(0); 2011/2012 F. Mallet Auto unboxing 22 Tableaux et collections Classe utilitaire : java.util.Collections Manipulations courantes de tableaux Recherche: int binarySearch(List<T> li, T val); T min(Collection<T> c); T max(Collection<T> c); Copy: Comparaison: Remplissage: Divers: void copy(List<T> l1, List<T> l2); Trie: void sort(List<T> li) 2011/2012 boolean disjoint(List<T> l1, List<T> l2); void fill(List<T> li, T val); void void void void replaceAll(List<T> li, T old, T new); reverse(List<T> li); rotate(List<T> li, int distance); shuffle(List<T> li); F. Mallet 23 Tableaux et collections Collections: JDK 1.1 JDK 1.1 java.util.Vector java.util.Enumeration java.util.HashTable => => => java.util.ArrayList java.util.Iterator 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