5. Collections dans Java Olivier Curé - UMLV [page 143 ]
Présentation générale Une collection est un objet qui contient d'autres objets. Ces objets proposent une solution au stockage de données et permettent une manipulation de celles-ci Les classes et interfaces se trouvent dans le paquetage : java.util. Olivier Curé - UMLV [page 144 ]
Collections et versions de Java Premières versions de Java : Tableaux Vector : tableaux dynamiques (listes) Hashtable : tables associatives A partir de Java2, existence d'une infrastructure pour la gestion de collections ( dans le package java.util). Olivier Curé - UMLV [page 145 ]
Infrastructure Offre une architecture unifiée pour représenter et manipuler les collections. Composée de 3 parties : Une hiérarchie d'interfaces permettant de représenter les collections sous forme de types abstraits. Des implémentations de ces interfaces. Implémentation de méthodes liées aux collections (recherche, tri, etc.). Olivier Curé - UMLV [page 146 ]
Avantages Les collections permettent de : Améliorer la qualité et la performance des applications Réduire l'effort lors de l'implémentation Faciliter l'apprentissage de nouvelles API Réduire le coût de conception de nouvelles API Encourager le réutilisation de logiciels. Olivier Curé - UMLV [page 147 ]
Interfaces 2 hiérarchies principales : Map : collections indexées par des clés (Cf. Entrées d'un dictionnaire) Collection Olivier Curé - UMLV [page 148 ]
Classes Abstraites : AbstractCollection, AbstractMap, AbstractList,... Concrètes : ArrayList, HashSet, TreeSet, HashMap,... Elles héritent des classes abstraites Olivier Curé - UMLV [page 149 ]
Interface Collection Un objet qui est un groupe d'objets Principales méthodes : boolean add(object obj) boolean contains(object obj) boolean containsall(collection collection) Iterator iterator() int size() Object[] toarray() Object[] toarray(object[] tableau) Olivier Curé - UMLV [page 150 ]
Interface Set Un groupe d'objets n'acceptant pas 2 objets égaux (au sens de equals). Implémentations : HashSet garantit un temps constant pour les opérations de base (set, size, add, remove). TreeSet garantit que les éléments sont rangés dans leur ordre naturel (interface Comparable) ou l'ordre d'un Comparator. Olivier Curé - UMLV [page 151 ]
Interface List Un groupe d'objets repérés par des numéros (en débutant à l'indice 0). Classes implémentées : ArrayList (tableau à taille variable), LinkedList (listechaînée) En règle générale, on utilise ArrayList maislinkedlist est utile si il y a beaucoup d'opérations d'insertions/suppressions (evite les décalages). Olivier Curé - UMLV [page 152 ]
Classe ArrayList Une sorte de tableau contenant un nombre quelconque d'instances de la classe Object (utiliser Integer pour ranger des entiers). Les emplacements sont repérés par des valeurs entières (à débutant à 0, comme un tableau). Les méthodes ne sont pas synchronisées (Vector). Olivier Curé - UMLV [page 153 ]
Méthodes de ArrayList boolean add(object obj) void add(int indice, Object obj) boolean contains(object obj) Object get(int indice) => casting l'élément. int indexof(object obj) Iterator iterator() void remove(int indice) void set(int indice, Object obj) int size() Olivier Curé - UMLV [page 154 ]
Exemple d'arraylist ArrayList liste = new ArrayList(); Personne p1 = new Personne("Toto"); liste.add(p1); // création d'autres instances de Personne for (int cpt=0; cpt<liste.size();cpt++) } System.out.println(((Personne)liste.get(cpt)).getNom( )); Olivier Curé - UMLV [page 155 ]
Exemple d'arraylist avec les génériques ArrayList<Personne> liste = new ArrayList<Personne>(); liste.add(new Personne("Toto")); // création d'autres instances de Personne for (int cpt=0; cpt<liste.size();cpt++) System.out.println(liste.get(cpt).getNom()); } Olivier Curé - UMLV [page 156 ]
Interface Iterator Une interface permettant d'énumérer les éléments contenus dans une collection. Toutes les collections proposent une méthode itérator renvoyant un itérateur. Parcours dans un sens uniquement. Cf. ListIterator pour un parcours bidirectionnel. Olivier Curé - UMLV [page 157 ]
Méthodes d'iterator boolean hasnext() object next() Lance une exception NoSuchElementException lorsqu'il n'y a plus rien à renvoyer. Olivier Curé - UMLV [page 158 ]
Exemple d'iterator ArrayList<Personne> liste = new ArrayList<Personne>(); liste.add(new Personne("Toto")); // création d'autres instances de Personne Iterator<Personne> it = liste.iterator(); while(it.hasnext()) { System.out.println(it.next().getNom()); } Olivier Curé - UMLV [page 159 ]
Exemple d'iterator (2) ArrayList<Personne> liste = new ArrayList<Personne>(); liste.add(new Personne("Dupont", "Marie")); // création d'autres instances de Personne Iterator<Personne> it = liste.iterator(); while(it.hasnext()) { Personne tmp = it.next(); System.out.println(tmp.getNom()+" "+tmp.getprenom()); } Olivier Curé - UMLV [page 160 ]
foreach Une autre alternative pour l'itération sur des structures. Syntaxe : for(type var : Objet) Exemple : for(string s : mylist), avec mylist<string> Olivier Curé - UMLV [page 161 ]
Interface Map Des couples clé-valeur. Une clé repère une unique valeur. Implémentations : HashMap : table de hachage avec garantie d'un accès en temps constant. TreeMap : arbre ordonnée* suivant les valeurs des clés (accès en log(n)). * ordre naturel ou une instance de Comparator. Olivier Curé - UMLV [page 162 ]
Méthodes de Map boolean containskey(object clé) boolean containsvalue(object valeur) Set entryset() Object get(object clé) // null si objet n'existe pas. boolean isempty() Set keyset() int size() Collection values() Olivier Curé - UMLV [page 163 ]
Table de hachage Une table de hachage range des éléments en les regroupant dans des sous-ensembles pour les retrouver plus rapidement. Le regroupement dépend de la valeur d'un calcul effectué sur les éléments. On retrouve l'élément en fournissant la valeur. Recherche efficace si répartition uniforme des éléments sur les sous-ensembles. Olivier Curé - UMLV [page 164 ]
Classe HashMap Utilise la structure d'une table de hachage pour ranger les clés. La méthode hashcode() est exploitée pour répartir les clés dans la table de hachage. Olivier Curé - UMLV [page 165 ]
Exemple de HashMap Map<String, Personne> hm = new HashMap<String, Personne>(); hm.put("p101",new Personne("Toto")); hm.put("p102",new Personne("Titi")); Personne p = (Personne) hm.get("p101"); System.out.println(p.getNom()); Collection elements = hm.values(); Iterator<Personne> it = elements.iterator(); while(it.hasnext()) { System.out.println(it.next().getNom()); } Olivier Curé - UMLV [page 166 ]
Trier une liste import java.util.*; public class Coll1 { public static void main(string args[]) { List<Integer> liste = new ArrayList<Integer>(); liste.add( new Integer(9)); liste.add(new Integer(12)); liste.add(new Integer(5)); Collections.sort(liste); Iterator<Integer> it = liste.iterator(); while (it.hasnext()) { System.out.println((it.next()).toString()); } } Olivier Curé - UMLV [page 167 ]
Recherche dans une liste import java.util.*; public class ListePersonneTest { public static void main(string[] args) { List<Personne> liste = new ArrayList<Personne>(); Personne p1 = new Personne("Xyel","Pierre"); Personne p2 = new Personne("Durand","jean"); Personne p3 = new Personne("Smith","Joe"); liste.add(p1); liste.add(p2); liste.add(p3); Collections.sort(liste, new ComparatorPersonne()); System.out.println("Recherche ="+ Collections.binarySearch(liste,p1,new ComparatorPersonne())); } } // Exécution : Rercherche = 2. Olivier Curé - UMLV [page 168 ]
Interface Comparator Elle propose une méthode : int compare(object o1, Object o2) Elle doit renvoyer : Un entier positif si o1 est "plus grand" que o2. 0 si la valeur de o1 est identique à celle de o2. Une entier négatif si o1 est "plus petit" que o2. Olivier Curé - UMLV [page 169 ]
Exemple d'un Comparator import java.util.comparator; public class ComparatorPersonne implements Comparator { public int compare(object o1, Object o2) { String nom1 = ((Personne) o1).getnom(); String nom2 = ((Personne) o2).getnom(); return nom1.compareto(nom2); } } Olivier Curé - UMLV [page 170 ]
import java.util.* Utilisation d'un Comparator public class ListePersonneTest { } public static void main(string[] args) { List liste = new ArrayList(); Personne p1 = new Personne("Xyel","Pierre"); Personne p2 = new Personne("Durand","jean"); Personne p3 = new Personne("Smith","Joe"); liste.add(p1); liste.add(p2); liste.add(p3); Collections.sort(liste, new ComparatorPersonne()) } Olivier Curé - UMLV [page 171 ]