Vous êtes sur la page 1sur 12

- IFT1176 - Aspects avancs en Java -

1/12

Collections en Java1

Bibliographie:

Ce document est inspir grandement de la page web de SUN sur les collections, qui se trouve : http://developer.java.sun.com/developer/onlineTraining/collections/Collection.html et les notes de cours du Prof. Guy Lapalme. Mohamed N. Lokbani

v1.01

- IFT1176 - Aspects avancs en Java -

2/12

1. Structures de donnes C'est l'organisation efficace d'un ensemble de donnes, sous la forme de tableaux, de listes, de piles etc. Cette efficacit rside dans la quantit mmoire utilise pour stocker les donnes, et le temps ncessaire pour raliser des oprations sur ces donnes.

2. Collections & Java Une collection gre un groupe d'un ensemble d'objets d'un type donn ; ou bien c'est un objet qui sert stocker d'autres objets. Dans les premires versions de Java, les collections taient reprsentes par les "Array","Vector","Stack" etc. Puis avec Java 1.2 (Java 2), est apparu le framWork de collections qui tout en gardant les principes de bases, il a apport des modifications dans la manire avec laquelle ces collections ont t ralises et hirarchises. Tout en collaborant entre elles, ces collections permettent de raliser dans des catgories de logiciels des conceptions rutilisables.

3. Collections Framwork de Java

Rparties en deux groupes: 3.1. Interfaces

Organises en deux catgories: Collection & Map.

Mohamed N. Lokbani

v1.01

- IFT1176 - Aspects avancs en Java -

3/12

- Collection: un groupe d'objets o la duplication peut-tre autorise. - Set: est ensemble ne contenant que des valeurs et ces valeurs ne sont pas dupliques. Par exemple l'ensemble A = {1,2,4,8}. Set hrite donc de Collection, mais n'autorise pas la duplication. SortedSet est un Set tri. - List: hrite aussi de collection, mais autorise la duplication. Dans cette interface, un systme d'indexation a t introduit pour permettre l'accs (rapide) aux lments de la liste. - Map: est un groupe de paires contenant une cl et une valeur associe cette cl. Cette interface n'hrite ni de Set ni de Collection. La raison est que Collection traite des donnes simples alors que Map des donnes composes (cl,valeur). SortedMap est un Map tri. 3.2. Implmentations Le framework fournit les implmentations suivantes des diffrentes interfaces: Classes d'implmentations Table de Hachage Interfaces Set HashSet List Map HashMap

Tableau de Arbre taille variable balanc TreeSet ArrayList TreeMap

Liste chane

LinkedList

Par contre, il n'y a pas d'implmentation de l'interface Collection. Pour Set et Map l'implmentation est soit sous la forme d'une table de hachage (HashSet/HashMap) ou bien sous la forme d'un arbre (TreeSet/TreeMap). Pour la liste: soit sous la forme de tableau (ArrayList) ou une liste chane (LinkedList).

4. Algorithmes Sont utiliss pour traiter les lments d'un ensemble de donnes. Ils dfinissent une procdure informatique, par exemple: tris, recherche etc.

5. Itrateurs Fournissent aux algorithmes un moyen pour parcourir une collection du dbut la fin. Ce moyen permet de retirer donc la demande des lments donns de la collection.

Mohamed N. Lokbani

v1.01

- IFT1176 - Aspects avancs en Java -

4/12

6. Description des interfaces

6.1. Collection
public interface Collection { // Basic Operations int size(); boolean isEmpty(); boolean contains(Object element); boolean add(Object element); // Optional boolean remove(Object element); // Optional Iterator iterator();

int hashCode(); boolean equals(Object element); // Bulk Operations boolean containsAll(Collection c); boolean addAll(Collection c); // Optional boolean removeAll(Collection c); // Optional boolean retainAll(Collection c); // Optional void clear(); // Optional // Array Operations Object[] toArray(); Object[] toArray(Object a[]); }

Les interfaces contiennent des mthodes optionnelles. Cette approche permet de traiter les collections particulires sans que nous soyons dans l'obligation de dfinir les mthodes optionnelles. Ces mthodes optionnelles sont dfinies qu'en cas de besoin. Un Set non modifiable n'a pas besoin de redfinir la mthode add, puisque nous ne pouvons pas le modifier! Il y a des oprations ralises sur un seul objet ou bien sur une collection (un ensemble d'objets). add (remove) permet d'ajouter (resp. de retirer) un lment. Quand addAll (removeAll) permet d'ajouter (resp. de retirer mme si les lments sont dupliqus dans la collection originale) une collection. contains (containsAll) permet de vrifier si un objet (resp. les lments d'une collection) est prsent dans la collection. size, isEmpty et clear, permettent respectivement de donner la taille de la collection, de vrifier si la collection est vide et finalement d'effacer le contenu de la collection.
Mohamed N. Lokbani

v1.01

- IFT1176 - Aspects avancs en Java -

5/12

retainsAll se comporte comme le rsultat de l'intersection de deux ensembles. Si A={1,2,5,8} et B={3,8} alors A = {8}. equals permet de tester si deux objets sont gaux. hashCode retourne le code de hachage calcul pour la collection. toArray retourne les lments de la collection sous le format d'un tableau. toArray(Object a[]) permet de prciser le type du tableau retourner. Si le tableau est grand les lments sont rangs dans ce tableau, sinon un nouveau tableau est cre pour recevoir les lments de la collection. L'interface collection est dote d'une instance d'une classe qui implante l'interface Iterator. C'est l'outil utilis pour parcourir une collection. L'interface Iterator contient ce qui suit:
public interface Iterator { boolean hasNext(); Object next(); void remove(); // Optional }

hasNext permet de vrifier s'il y a un lment qui suit. next permet de pointer l'lment suivant. remove permet de retirer l'lment courant.
Collection collection = ...; Iterator iterator = collection.iterator(); while (iterator.hasNext()) { Object element = iterator.next(); if (removalCheck(element)) { iterator.remove(); } }

Les collections vues comme des ensembles ralisent les 3 oprations mathmatiques sur des ensembles: union: add et addAll intersection: retainAll diffrence: remove et removeAll

Mohamed N. Lokbani

v1.01

- IFT1176 - Aspects avancs en Java -

6/12

6.2. Set C'est une interface identique celle de Collection. Deux implmentations possibles: TreeSet: les lments sont rangs de manire ascendante. HashSet: les lments sont rangs suivant une mthode de hachage.
import java.util.*; public class SetExample { public static void main(String args[]) { Set set = new HashSet(); // Une table de Hachage set.add("Bernadine"); set.add("Elizabeth"); set.add("Gene"); set.add("Elizabeth"); set.add("Clara"); System.out.println(set); Set SetTrie = new TreeSet(set); // Un Set tri System.out.println(sortedSet); } } [Gene, Clara, Bernadine, Elizabeth] [Bernadine, Clara, Elizabeth, Gene]

6.2. List Liste est une collection ordonne. Elle permet la duplication des lments. L'interface est renforce par des mthodes permettant d'ajouter ou de retirer des lments se trouvant une position donne. Elle permet aussi de travailler sur des sous listes. On utilise le plus souvent des ArrayList sauf s'il y a insertion d'lment(s) au milieu de la liste. Dans ce cas il est prfrable d'utiliser une LinkedList pour viter ainsi les dcalages.
public interface List extends Collection { // Positional Access Object get(int index); Object set(int index, Object element); // Optional void add(int index, Object element); // Optional Object remove(int index); // Optional boolean addAll(int index, Collection c); // Optional // Search int indexOf(Object o); int lastIndexOf(Object o); // Iteration ListIterator listIterator(); ListIterator listIterator(int index); // Range-view List subList(int fromIndex, int toIndex); }

Mohamed N. Lokbani

v1.01

- IFT1176 - Aspects avancs en Java -

7/12

Les mthodes de l'interface List permettent d'agir sur un lment se trouvant un index donn ou bien un ensemble d'lments partir d'un index donn dans la liste. get (remove) retourne (resp. retirer) l'lment se trouvant la position index. set (add & addAll) modifie (resp. ajouter) l'lment (resp. un seul ou une collection) se trouvant la position index. indexOf (lastIndexOf) recherche si un objet se trouve dans la liste et retourner son (resp. son dernier) index. subList permet de crer un sous liste d'une liste. Pour parcourir une liste, il a t dfini un itrateur spcialement pour la liste.
public interface ListIterator extends Iterator { boolean hasNext(); Object next(); boolean hasPrevious(); Object previous(); int nextIndex(); int previousIndex(); void remove(); // Optional void set(Object o); // Optional void add(Object o); // Optional }

permet donc de parcourir la liste dans les deux directions et de modifier un lment (set) ou d'ajouter un nouveau lment.
List list = ...; ListIterator iterator = list.listIterator(list.size()); while (iterator.hasPrevious()) { Object element = iterator.previous(); // traitement d'un lment }

hasNext permet de vrifier s'il y a un lment qui suit. next permet de pointer l'lment courant. nextIndex retourne l'index de l'lment courant. Pour les sous listes, elles sont extraites des listes de fromIndex (inclus) toIndex (non inclus). Tout changement sur les sous listes affecte la liste de base, et l'inverse provoque un tat indfini s'il y a accs la sous liste.

Mohamed N. Lokbani

v1.01

- IFT1176 - Aspects avancs en Java -

8/12

import java.util.*; public class ListExample { public static void main(String args[]) { List list = new ArrayList(); list.add("Bernadine"); list.add("Elizabeth"); list.add("Gene"); list.add("Elizabeth"); list.add("Clara"); System.out.println(list); System.out.println("2: " + list.get(2)); System.out.println("0: " + list.get(0)); LinkedList queue = new LinkedList(); queue.addFirst("Bernadine"); queue.addFirst("Elizabeth"); queue.addFirst("Gene"); queue.addFirst("Elizabeth"); queue.addFirst("Clara"); System.out.println(queue); queue.removeLast(); queue.removeLast(); System.out.println(queue); } } Bernadine, Elizabeth, Gene, Elizabeth, Clara] 2: Gene 0: Bernadine [Clara, Elizabeth, Gene, Elizabeth, Bernadine] [Clara, Elizabeth, Gene]

6.3. Map C'est un ensemble de paires, contenant une cl et une valeur (en ralit, nous pouvons associer plusieurs valeurs. Dans ce cas la, nous sommes en prsence d'une multimap voir en dmo.). Deux cls ne peuvent tre gales au sens de equals. L'interface interne Entry permet de manipuler les lments d'une paire comme suit:
public interface Entry { Object getKey(); Object getValue(); Object setValue(Object value); }

getKey & getValue retournent respectivement la cl et la valeur associe cette cl. setValue permet de modifier une valeur d'une paire. Remarque: faire attention de ne pas modifier directement la valeur associe une cl. Pour le faire, retirer l'ancienne cl (et donc sa valeur aussi) et ajouter une nouvelle cl (avec cette nouvelle valeur).
Mohamed N. Lokbani v1.01

- IFT1176 - Aspects avancs en Java -

9/12

public interface Map { // Basic Operations Object put(Object key, Object value); Object get(Object key); Object remove(Object key); boolean containsKey(Object key); boolean containsValue(Object value); int size(); boolean isEmpty(); // Bulk Operations void putAll(Map t); void clear(); // Collection Views public Set keySet(); public Collection values(); public Set entrySet(); // Interface for entrySet elements public interface Entry { Object getKey(); Object getValue(); Object setValue(Object value); } }

values retourne les valeurs sous la forme dune Collection. keySet et entrySet retournent, respectivement, un ensemble (Set) de cls et un ensemble (set) d'Entry. Ceci permet donc d'itrer sur les Map comme suit: si m est un HashMap alors:
// sur les cls for (Iterator i = m.keySet().iterator();i.hasNext();) System.out.println(i.next()); // sur les valeurs for (Iterator i = m.values().iterator();i.hasNext();) System.out.println(i.next()); // sur la paire cl/valeur for (Iterator i = m.keySet().iterator();i.hasNext();){ Map.Entry e = (Map.Entry) i.next(); System.out.println(e.getKey() + " ; " + e.getValue()); }

Mohamed N. Lokbani

v1.01

- IFT1176 - Aspects avancs en Java -

10/12

import java.util.*; public class MapExample { public static void main(String args[]) { Map map = new HashMap(); Integer ONE = new Integer(1); for (int i=0, n=args.length; i<n; i++) { String key = args[i]; Integer frequency = (Integer)map.get(key); if (frequency == null) { frequency = ONE; } else { int value = frequency.intValue(); frequency = new Integer(value + 1); } map.put(key, frequency); } System.out.println(map); Map sortedMap = new TreeMap(map); System.out.println(sortedMap); } }

7. Description des algorithmes L'ensemble des algorithmes manipulant les collections se trouve dans la classe Collections ( ne pas confondre avec l'interface Collection). Ces mthodes ont t dfinies statiques. Des algorithmes qui ne s'appliquent que sur des listes: Trier: sort(List list) ; trie une liste. sort(List list,Comparator comp) ; trie une liste en utilisant un comparateur. Mlanger: shuffle(List liste) ; mlange les lments de manire alatoire. Manipuler: reverse(List liste) ; inverse les lments de la liste. fill (List liste, Object element) ; initialise les lments de la liste avec element. copy(List dest, List src) ; copy une liste src dans une liste dest. Rechercher: binarySearch(List list, Object element) ; une recherche binaire d'un lment. binarySearch(List list, Object element, Comparator comp) ; une recherche binaire d'un lment en utilisant un comparateur.

Mohamed N. Lokbani

v1.01

- IFT1176 - Aspects avancs en Java -

11/12

Des algorithmes qui s'appliquent sur toutes les collections: effectuer des recherches extrmes: min, max etc. min (Collection) max (Collection)

8. Interface Comparable Un algorithme extrmement rapide et stable (les lments quivalents ne sont pas rordonns) est utilis pour trier la liste en utilisant l'ordre naturel du type. Le tri ne peut avoir lieu que si les classes implantent la mthode Comparable, ce qui n'est toujours pas le cas2. Cette classe contient une seule mthode compareTo:
interface Comparable { int compareTo(Object obj); }

Cette mthode retourne: - entier positif si l'objet qui fait l'appel est plus grand que obj, - zro s'ils sont identiques, - ngatif si l'objet qui fait l'appel est plus petit que obj. Dans le cas d'une classe qui n'implante pas la classe Comparable, ou bien vous voulez spcifier un autre ordre, vous devez implanter l'interface Comparator. Cette dernire permet de comparer deux lments de la collection. Pour trier, nous passons une instance de cette classe la mthode Sort().
interface Comparator { int compare(Object o1, Object o2); boolean equals(Object object); }

class CaseInsensitiveComparator implements Comparator { public int compare(Object element1,Object element2) { String lowerE1 = ( (String)element1).toLowerCase(); String lowerE2 = ( (String)element2).toLowerCase(); return lowerE1.compareTo(lowerE2); } }

C'est le cas pour les types primitifs: int, char, double, float, String etc.

Mohamed N. Lokbani

v1.01

- IFT1176 - Aspects avancs en Java -

12/12

9. Les librairies de collections Pour le langage C++ il existe une bibliothque appele la STL (Standard Templates Library), l'quivalent pour le langage java est la JGL (Generic collections library for Java) dveloppe par ObjectSpace. Vous pouvez la trouver cette adresse:
http://www.objectspace.com/products/voyager/downloads.asp

Si vous dcidez de la tlcharger, pas besoin de remplir tous les champs. D'aprs Zukowski3 (page 312), les informations fournies pour le tlchargement risqueraient de se retrouver dans la nature L'utilisation de la JGL n'est pas conseille vu sa complexit. Il est conseill d'installer la documentation associe. Il est signaler que la JGL n'a pas t mise jour depuis la version beta de java 1.2 ; de ce fait, la version 1.2 de java n'est pas supporte.

Zukowski, John : "Java Collections". diteur: Apress. www.apress.com ; en rserve la bibliothque de math/info. Le livre contient une description des collections en java. Attention le livre contient peu d'exemples, c'est plutt une description de point de vue technique des collections.

Mohamed N. Lokbani

v1.01

Vous aimerez peut-être aussi