Introduction :
Collections/Maps
- Les collections sont des objets permettant de g rer des ensembles d'objets
avec ventuellement la possibilit de g rer les doublons, les ordres de tri, etc.
- Elles sont utilis es pour stocker, retrouver et manipuler des donn es, ainsi
que pour transmettre des donn es dune m thode une autre.
- Les collections fournissent en plus une s paration entre leur impl mentation
effective et leur usage, permettant ainsi une meilleure r utilisabilit . Pour cela,
on utilise l'h ritage et les interfaces.
Exemples :
- un dossier de courrier : collection de mails
- un r pertoire t l phonique : collection d'associations noms/num ros de
t l phone.
S
La version 1 de Java proposait:
- java.util.Vector, java.util.Stack, java.util.Hashtable
- Une interface java.util.iterator permettant de parcourir ces objets.
1
Exemple de la collection "Stack"
import java.util.* ;
public class ExempleStack
{
Stack pile ;
public ExempleStack (){
pile = new Stack () ;
pile.push("Je suis ") ;
pile.push("Un exemple ") ;
pile.push("de pile");
Iterator iter = pile.iterator () ;
while (iter.hasNext()){
System.out.println (iter.next()) ;
}
}
public static void main(String[ ] args){
new ExempleStack () ;
}
}
Je suis
Un exemple
de pile
2
Exemple de la collection "TreeSet"
1 import java.util.*;
2
3 public class TestCollec {
4 public static void main(String argc[])
5 {
6
7
8
9
10
Set promotion= new TreeSet();
promotion.add(new Etudiant(1, "Turing"));
promotion.add(new Etudiant(2, "Babbage"));
if (promotion.contains(new Etudiant(4,"AAA")))
System.out.println("AAA appartient la
promotion");
11 }
12 }
3
*ligne 1 : les collections sont dans le package java.util
*ligne 6 : on cr e une collection de classe TreeSet, et on la range dans un
handle vers un Set.
*ligne 7 : On ajoute un nouvel tudiant dans l'ensemble promotion ,
l'aide de la m thode add.
*ligne 9 : On teste si AAA appartient la promotion, gr ce la m thode
contains.
4
La ligne 6 est tr s importante
- Ce que l'on veut, dans la suite du programme, c'est un ensemble. Peu importe,
pour la suite, la mani re dont cet ensemble est impl ment .
- Par contre, lors de la cr ation de cet ensemble, nous sommes bien forc de
choisir une impl mentation effective.
- Nous choisissons ici TreeSet (impl mentation d'un ensemble gr ce un arbre).
- Un point important est que nous ne pr cisons nulle part que TreeSet est un
ensemble d' tudiants.
- En fait, TreeSet est un ensemble d'Object
5
Collections partir de java 2
...
6
Collection : interface qui est impl ment e par la plupart des objets qui g rent
des collections.
Set : interface pour des objets qui n'autorisent pas la gestion des doublons dans
l'ensemble
SortedSet : interface qui tend l'interface Set et permet d'ordonner l'ensemble
List : interface pour des objets qui autorisent la gestion des doublons et un
acc s direct a un l ment
Queue : interface qui tend l'interface Collection pour une file de donn es type
FIFO
Dequeue : (double-ended queue) interface qui tend l'interface Collection pour
une file de donn es type FIFO/LIFO
7
Publicité
Map : interface qui d finit des m thodes pour des objets qui g rent des collections
sous la forme cl /valeur. Attention, ce nest pas un sous-type de collection !
SortedMap : interface qui tend l'interface Map et permet d'ordonner l'ensemble.
Un tableau associatif avec une relation d'ordre sur les cl s.
ConcurrentMap : interface qui tend l'interface Map pour une association acc s
concurrent
http://docs.oracle.com/javase/7/docs/api/java/util/Collection.html
http://docs.oracle.com/javase/tutorial/collections/interfaces/index.html
S
8
Collection<E> et types param tr s
- Toutes les collections sont des types param tr s par le type des l ments
(E) qu'elles contiennent
- Les collections sont des conteneurs homog nes
- Si l'on veut stocker des l ments de types diff rents, on utilise le super-
type commun, voir Object
9
Propri t s des collections
Sauf exceptions :
- Toutes les collections acceptent null comme un l ment valide
- Toutes les collections testent si un objet existe ou non par rapport la m thode
equals() de l'objet
- Toutes les collections ne permettent pas les acc s concurrents
Op rations optionnelles
- Certaines m thodes des collections sont des op rations optionnelles (signal es
par un - exemple : boolean add(E e))
- Celles-ci peuvent ne pas tre implant es par exemple pour d finir des collections
immutables exemple : ImmutableList
- Les op rations optionnelles non implant es l vent l'exception
UnsupportedOperationException
10
Les types g n riques
Les types g n riques permettent de sp cifier le type d'objets que l'on va
placer dans une collection d'objets (List, Vector,...)
Avantages:
- meilleure lisibilit : on conna t la lecture du programme quel type
d'objets seront plac s dans la collection.
- La v rification peut tre faite la compilation.
- Le cast pour r cup rer un objet de la collection est devenu implicite
(sans cette fonctionnalit , il fallait faire un cast explicite, sachant que
celui-ci peut chouer mais cela n' tait d tectable qu'a l'ex cution)
La syntaxe pour utiliser les types g n riques utilise les symboles < et >.
11
La g n ricit
- Une m thode peut tre param tr e avec des valeurs.
- La g n ricit permet de param trer du code avec des types de donn es.
Exemple :
class ArrayList<T>
- Ici le code est param tr par un type T
- Pour l'utiliser il faut passer un type en argument :
new ArrayList<Employe>()
S
12
L'interface java.util.Collection
Collection : super-type des structures de donn es de Java (sauf Map)
Avant Java 1.5, les l ments dune collection taient du type Object
Depuis 1.5, les collections sont param tr es par E, type des l ments
Une collection peut autoriser ou non plusieurs occurrences dun m me
l ment (List vs Set)
Les l ments peuvent tre ordonn s (position) ou non (List vs Set)
Les l ments peuvent tre tri s ou non (Set vs SortedSet)
Pour limiter le nombre dinterfaces, certaines m thodes peuvent :
*ne pas tre d finies sur un sous-type (UnsupportedOperationException)
*lever ClassCastException (cf checkedList, etc.)
Toute r alisation dune Collection devrait d finir :
- un constructeur par d faut (qui cr e une collection vide) et
- un constructeur qui prend en param tre une collection (conversion)
13
Linterface java.util.Collection<E>
public interface Collection<E> extends Iterable<E> {
// Basic operations
int size();
boolean isEmpty();
boolean contains(Object element);
// optional
boolean add(E element);
// optional
boolean remove(Object element);
Iterator<E> iterator();
// Bulk operations
boolean containsAll(Collection<?> c);
// optional
boolean addAll(Collection<? extends E> c);
// optional
boolean removeAll(Collection<?> c);
// optional
boolean retainAll(Collection<?> c);
// optional
void clear();
// Array operations
Object[] toArray();
<T> T[] toArray(T[] a);
}
http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html
14
Taille et effacement
Publicité
- L'interface d finit les m thodes :
int size() indiquant la taille d'une collection
boolean isEmpty() indiquant si une collection est vide.
void clear*() permettant d'effacer les donn es de la collection
Modification et test de contenue
- Les modifications et tests sont effectu es par :
boolean add*(E e) ajoute un l ment la collection, true si la collection
est modifi e
boolean remove*(Object o) retire un objet, true si la collection est
modifi e
boolean contains(Object) renvoie si la collection contient
l'objet
- remove() et contains() prennent en param tre des Object et non des E par
compatibilit
15
l ments et equals
Toutes les collections sauf exception (AbstractCollection par exemple)
testent si un objet existe en utilisant la m thode equals() de l'objet
16
Iterator
Supposons que nous ayons rang des tudiants dans un tableau. L'affichage de
l'ensemble des tudiants se ferait de la mani re suivante :
for (int i=0; i< tabEtuds.length; i++)
System.out.println(tabEtuds );
Supposons que nous ayons cr un type liste d' tudiants . Nous le parcourrions
de la mani re suivante :
for (ListeEtud l= listeEtuds; l != null; l= l.next)
System.out.println(l.getEtud());
Du point de vue de l'impl mentation, ces deux approches sont tr s diff rentes. Par
contre, du point de vue de l'utilisation, on remarque que l et i sont similaires. Ils
disposent chacun des fonctionnalit s suivantes :
on les initialise au d but de l'ensemble (i=0, l= listeEtuds) ;
on dispose d'un op rateur pour passer l' l ment suivant : (i++ et l=
l.next) ;
on dispose d'un test d'arr t : i < tabEtuds.length et l != null ;
on dispose d'une op ration pour r cup rer l' l ment courant : tabEtuds et
l.getEtud().
17
suite ...
De plus, ces quatre op rations permettent conceptuellement de parcourir n'importe
quel ensemble.
En java, ce concept est actualis par l'interface Iterator. Le code pr c dent peut
alors s' crire, pour n'importe quelle collection, de la mani re suivante :
for (Iterator i= promotion.iterator(); i.hasNext(); )
{
Etudiant e= (Etudiant) i.next();
System.out.println(e);
}
Remarquez que c'est promotion qui construit l'it rateur. C'est encore un usage de
l'h ritage !
Les op rations vues pr c demment tant repr sent es comme suit :
Cr ation, initialisation La cr ation d'un it rateur est effectu e par la collection elle-
m me, par l'appel de la m thode iterator() ;
R cup ration de l' l ment courant et avancement La m thode next() renvoie
la valeur de l' l ment courant, puis avance d'un cran.
Test d'arr t La m thode hasNext retourne vrai s'il est possible d'appeler next()
18
Pour r sumer
- Pour parcourir une collection, on utilise un objet permettant de passer en revue
les diff rents l ments de la collection
- java.util.Iterator<E> :
boolean hasNext() qui renvoie vrai s'il y a un suivant
E next() qui renvoie l' l ment courant et d cale sur l' l ment suivant
void remove() qui retire un l ment pr c demment envoy par next()
next() et NoSuchElementException
L'op ration next() est s curis e et l ve une exception dans le cas o on
d passe la fin de la collection (c-a-d si hasNext() renvoie false)
19
Organisation des interfaces
L'organisation de l'arbre d'h ritage pour les collections est le suivant :
(les interfaces d finissent les grandes lignes de ce que peut faire une collection)
interface java.util.Collection
interface java.util.List
interface java.util.Queue
interface java.util.Deque
interface java.util.Set
interface java.util.SortedSet
interface java.util.Map
interface java.util.SortedMap
interface java.util.ConcurrentMap
.
.
.
20
Organisation des classes
class java.util.AbstractCollection (implements
java.util.Collection)
class java.util.AbstractList (implements java.util.List)
class java.util.AbstractSequentialList
class java.util.LinkedList (implements java.util.List)
class java.util.ArrayList (implements java.util.List)
class java.util.Vector (implements java.util.List)
Publicité
class java.util.Stack
class java.util.AbstractSet (implements java.util.Set)
class java.util.HashSet (implements java.util.Set)
class java.util.TreeSet (implements java.util.SortedSet)
class java.util.AbstractMap (implements java.util.Map)
class java.util.HashMap (implements java.util.Map)
class java.util.TreeMap (implements java.util.SortedMap)
class java.util.WeakHashMap (implements java.util.Map)
.
.
.
21
Pour comprendre
les listes (List) sont des suites d' l ments. On peut, soit les parcourir du
premier au dernier, soit acc der au i me l ment ;
les ensembles (Set) ne comportent pas de doublets. Un l ment appartient un
ensemble ou ne lui appartient pas. Contrairement aux listes, on ne peux pas choisir
o ins rer un l ment. Les SortedSet sont des ensembles tri s, c'est- -dire que
les l ments seront rang s du plus petit au plus grand (selon la m thode
compareTo).
les dictionnaires (Map) sont des tableaux associatifs. C'est- -dire des tableaux
dont les indices sont d'un type quelconque. On peut par exemple avoir comme
indice une cha ne de caract res, et crire des choses comme :
definitions.put("chauve-souris", "mammif re insectivore volant");
Map.Entry, permet de manipuler un dictionnaire comme un ensemble (Set) de
d nitions.
22
En ce qui concerne les classes, elles fournissent des impl mentations de ces
interfaces. Le choix de la classe utilis e d pend de l'usage que l'on veut en
faire.
LinkedList fournit une liste doublement cha n e. L'ajout d'un l ment est
rapide, mais la recherche d'une valeur donn e et l'acc s au ie l ment sont en
O(n).
ArrayList est une impl mentation base de tableau. L'ajout d'un l ment
peut tre plus co teux que dans le cas d'une LinkedList si le tableau doit
grossir, mais par contre l'acc s au i me l ment est en temps constant.
Vector est un quivalent de ArrayList datant du jdk1.0. Les diff rences
entre les deux se situent surtout lorsque l'on utilise le multit che (Vector est
synchronis , c.f. cours Threads).
Stack est un type sp cial de vecteur, utilis pour r aliser des piles. Les
piles sont des structures de donn es tr s utiles.
23
Pour le reste :
Hash signifie que l'impl mentation utilise un algorithme de hachage : elle
associe chaque l ment un nombre (par exemple, on pourrait associer
une cha ne de caract res la somme des codes des caract res qu'elle
contient), et elle utilise ce nombre comme indice dans un tableau. Les
impl mentations par hachage sont g n ralement tr s rapides pour des
volumes moyens de donn es. Par contre, elles ne permettent pas de
r cup rer les l ments dans l'ordre.
Tree signifie que l'impl mentation utilise un arbre. Les arbres sont des
structures tr s robustes, adapt es de grands volumes de donn es. De
plus, ils permettent de r cup rer les l ments dans l'ordre croissant.
24
L'interface java.util.List<E>
25
La classe ArrayList<E>
Tout comme LinkedList<E> (liste cha n e), ArrayList<E> implante
l'interface List. Elle est utiliser pour les tableaux taille variable.
Constructeurs
" ArrayList()
" ArrayList(int taille_initiale) : peut tre utile si on conna t la
taille finale ou initiale (apr s les premiers ajouts) la plus probable car vite
les op rations daugmentation de la taille du tableau sous-jacent
" ArrayList(Collection c) : pour linterop rabilit entre les diff rents
types de collections
M thodes principales
- boolean add(E elt)
- void add(int indice, E elt)
- boolean contains(Object obj)
- E get(int indice)
- int indexOf(Object obj)
- Iterator<E> iterator()
- E remove(int indice)
- E set(int indice, E elt)
- int size()
26
Exemple
List<Employe> le = new ArrayList<>();
Employe e = new Employe("Dupond");
le.add(e);
// Ajoute dautres employ s
//. . .
// Affiche les noms des employ s
for (int i = 0; i < le.size(); i++) {
System.out.println(le.get(i).getNom());
}
Pour aller plus vite :
for (Iterator i=le.iterator(); i.hasNext(); )
i.next().getNom();
27
La classe java.util.Vector<E>
28
La classe java.util.Vector<E>, suite ...
29
La classe java.util.Vector<E>, suite ...
" La manipulation des objets Vector est plus lente que celle des tableaux
" On ne peut y stocker que des objets (Object). Ils ne peuvent pas contenir
des primitifs.
" L'insertion d'un objet entra ne un sur-casting implicite
Publicité
" L'utilisation d'un l ment du vecteur n cessite un sous-casting
Cr ation d'un vecteur
" Vector<Fraction> v ;
" v = new Vector<Fraction>();
v est de taille 10 et d'incr ment 1
l'incr ment est l'augmentation de la taille du vecteur une fois plein
" v = new Vector<Fraction>(int n);
v est de taille n
" v = new Vector<Fraction>(int n, int inc);
v est de taille n et d'incr ment inc
un incr ment 0 double la taille du vecteur
30
M thodes de Vector
" v.size() donne la taille du vecteur
" v.setSize(int n) modifie la taille de v
" v.addElement (Object obj) ajoute l' l ment obj
" v.setElementAt (Object obj,int n) modifie l' l ment n
" Object obj = v.elementAt(int n) extrait l' l ment n
31
Exemple
import java.util.*;
class DesEntiers {
static Vector<Integer> v;
static Random r = new Random();
public static void main (String [] args){
v = new Vector<Integer>();
for(int i =0; i<20;i++)
v.addElement( new Integer(r.nextInt()));
for(int i =0; i< v.size();i++){
Integer obj = v.elementAt(i);
System.out.println(""+ obj.intValue());
}
}
}
32
Exercices
" Modifier l'exemple pr c dent pour cr er un vecteur de Boolean et Integer
al atoirement (le vecteur contient un m lange de ces objets) Imprimer les
l ments du vecteur
" Cr er un Vector de Voiture en cr ant al atoirement le nombre et les attributs
des objets Voiture
33
import java.util.*;
class DesEntiersEtBool ens {
static Vector v;
static Random r = new Random();
public static void main (String [] args){
v = new Vector(20, 0);
int n = r.nextInt(30);
for(int i =0; i<n;i++){
if(r.nextBoolean())
v.addElement( new Integer(r.nextInt()));
else
v.addElement( new Boolean(r.nextBoolean()));
}
for(int i =0; i<v.size();i++){
Object obj = v.elementAt(i);
if(obj.getClass().getName().equals("java.lang.Integer")) {
System.out.println(""+ ((Integer)obj).intValue());
}
else {
System.out.println(""+ ((Boolean)obj).booleanValue());
}
}
}
}
}
34
import java.util.*;
class DesV hicules {
Vector<Voiture> v;
public static void main (String [] args){
Random r = new Random();
int n = 1+ r.nextInt(100);
for(int i =0; i<n;i++)
if(r.nextBoolean()){
Voiture f = new Voiture(3*r.nextFloat(),
3r.nextFloat(), 3r.nextFloat(),3*r.nextFloat());
v.addElement(f);
}
System.out.println(v);
}
}
35
36
37
38