278
Introduction
Une collection est un objet qui gère un groupe
d’objets qu’on appelle ses éléments.
279
1
Types de collections
Il existe plusieurs types de collections qui diffèrent
selon plusieurs critères :
L’acceptation de doublons
L’ordre
etc…
280
281
2
Famille de l’interface Collection
Se compose de trois sous-famille :
Sous-famille des ensembles : implémente l’interface Set
282
283
3
Famille de l’interface Collection
Quelques méthodes de l'interface collection :
int size() : retourne la taille de la collection.
boolean add(E e) : ajoute un nouvel élément à la
collection.
boolean addAll(Collection c) : ajoute une collection
d'éléments à la fois à la collection.
Object[] toArray() : retourne les objets de la collection
dans un tableau.
void clear() : vide la collection.
boolean contains(Object o) : cherche un objet dans la
collection.
284
Remarque :
Nous retrouvons ces méthodes dans les interfaces Set, List
et Queue qui héritent de l'interface collection et par
conséquent, dans toutes les classes qui les implémentent.
285
4
Sous-famille des Set
Est représentée par l'interface Set
286
287
5
Exemple de Set
Exemple avec HashSet :
import java.util.*;
public class SetExample {
public static void main(String[] args) {
Set set = new HashSet();
set.add("un"); set.add("deux"); set.add("trois");
set.add(4); set.add(new Float(5.0F));
set.add("deux"); // dupliqué, non ajouté
set.add(new Integer(4)); // dupliqué, non ajouté
System.out.println(set);
}
}
288
Exemple de Set
Exemple avec TreeSet :
import java.util.*;
public class SetExample {
public static void main(String[] args) {
Set set = new TreeSet();
set.add("Bachir"); set.add("Omar"); set.add("Ali");
set.add("Ali"); // dupliqué, non ajouté
System.out.println(set);
}
}
289
6
La famille des List
Est représentée par l'interface List
290
291
7
La famille des List
Classes les plus connues:
ArrayList : tableau redimensionnable non synchronisé
Stack : Pile
292
293
8
La famille des List
boolean contains(Object o) : cherche un element dans la
liste.
294
Un exemple de List
import java.util.*;
public class ListExample {
public static void main(String[] args) {
List list = new ArrayList();
list.add("un"); list.add("deux"); list.add("trois");
list.add(new Integer(4)); list.add(new Float(5.0F));
list.add("deux"); // dupliqué, ajouté
list.add(new Integer(4)); // dupliqué, ajouté
System.out.println(list);
}
}
Résultat du programme : [un, deux, tois, 4, 5.0, deux, 4]
295
9
La famille des Map
Sont représentés par l'interface Map
296
297
10
La famille des Map
Classes les plus connues:
Hashtable : utilise une table de hachage pour lier les clés
aux valeurs
298
L’interface Map
Quelques méthodes :
V put(K key, V value) : associe la clé K à la valeur V
299
11
L’interface Map : exemple
import java.util.*;
public class MapExample {
public static void main(String args[]) {
Map map = new HashMap();
map.put("premier","1er");
map.put("second", new Integer(2));
map.put("troisième","3eme");
map.put("troisième","III"); // écrase l’affectation précédente
Set set1 = map.keySet(); // retourne un Set de clés
Collection collection = map.values(); //retourne une Collection de valeurs
Set set2 = map.entrySet(); // retourne un set de clé-valeurs
System.out.println(set1 + "\n" + collection + "\n" + set2);
}
}
300
301
12
La famille des Queue
Représentent les files (FIFO)
302
L'interface Queue
Quelques méthodes :
Boolean add(E e) : ajoute un élément à la fin de la file.
Retourne true ou une exception.
boolean offer(E e) : ajoute un élément à la fin de la file.
Retourne true ou false.
E element() : retourne la tête de la file sans l'enlever.
génère une exception si vide.
E peek() : retourne la tête de la file sans l'enlever.
Retourne null si vide.
E poll() : retourne et enlève la tête de la file (null si vide).
E remove() : retourne et enlève la tête de la file
(exception si vide)
303
13
L'interface Queue : Exemple
import java.util.*;
FileDattente.add("Hassan"); FileDattente.add("Taha");
}
Java - Dr A. Belangour 304
304
305
14
Les collections patrimoniales
Les anciennes classes collection sont :
La classe Vector, qui implémente l’interface List.
306
Vector
Permet de stocker des objets dans un tableau dont la
taille évolue avec les besoins.
Quelques méthodes :
addElement(Object):ajoute un élémént à la fin
307
15
Vector
Exemple :
Vector v = new Vector();
v.addElement(new Integer(10));
v.addElement(new Float(3.14));
v.insertElementAt("chaine",1);
Remarque :
La classe Vector est sysnchronisée et donc moins rapide
que ArrayList.
308
Stack
Reprèsente une PILE (LIFO)
Méthodes :
boolean empty() : teste si la pile est vide.
309
16
Stack
Exemple :
Stack pile= new Stack()
Pile.push("Ali");
Pile.push(new Integer(3));
Pile.push(new Float(5.2));
310
L’interface Iterator
Interface ListIterator
311
17
Parcours des collections
L’interface Enumeration
Appartient au package java.util
Définit 2 méthodes :
boolean hasMoreElements() : retourne true si
l'énumeration contient encore un ou plusieurs elements
312
313
18
Parcours des collections
L’interface Iterator
Appartient au package java.util
314
315
19
Parcours des collections
L’interface ListIterator
Appartient au package java.util
Méthodes :
void add(Object o) : ajoute un élément à la liste.
316
317
20
Parcours des collections
Exemple :
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class ListIteratorExemple {
public static void main(String a[]){
List noms= new ArrayList();
noms.add("Ali"); noms.add("Omar"); noms.add("Hassan");
//Obtention de l’itérateur
ListIterator litr=noms.listIterator();
System.out.println("Parcours en avant:");
while(litr.hasNext()){ System.out.println((String)litr.next()); }
System.out.println("Parcours en arrière:");
while(litr.hasPrevious()){
System.out.println((String)litr.previous());
}
}
}
318
319
21
Parcours des collections
Exemple :
import java.util.ArrayList;
import java.util.List;
public class ForExemple {
public static void main(String a[]){
List noms= new ArrayList();
noms.add("Ali"); noms.add("Omar"); noms.add("Hassan");
//Parcours avec For
System.out.println("Parcours avec For:");
for(Object o : noms){
System.out.println((String)o);
}
}
}
320
321
22
L’interface Comparable
Impose l’ordre naturel aux classes qui l’implémente :
Utilisé pour le tri
int compareTo(Object o)
322
L’interface Comparable
Dans le tri, les éléments d’une liste suivent un ordre
naturel selon le type des éléments :
Les éléments String : ordre alphabétique
323
23
Comparable : un exemple
public class Etudiant implements Comparable{
// constructeur
//getters setters
324
Comparable : un exemple
public String getCNE() { return CNE; }
@Override
return "CNE="+CNE+"Nom="+nom+"Moyenne="+moyenne;
325
24
Comparable : un exemple
@Override
public int compareTo(Object o) {
double diff = this.moyenne-((Etudiant) o ).moyenne;
if (diff == 0.0) return 0; // 0 égaux
else if (diff<0.0) return -1; // inferieure
else return 1; // superieure
}
}
326
Comparable : un exemple
import java.util.*;
public class ComparableTest {
public static void main(String[] args) {
TreeSet etudiants = new TreeSet();
etudiants.add(new Etudiant("2014/354", "Ali",15.5));
etudiants.add(new Etudiant("2014/358", "Omar",12.5 ));
etudiants.add(new Etudiant("2014/398", "Taha",13.6));
etudiants.add(new Etudiant("2014/253", "Anass",14.3));
Object[] tabEtudiants = etudiants.toArray();
for(Object o: tabEtudiants ){
System.out.println((Etudiant) o);
}
}
}
327
25
Comparable : un exemple
Résultat du programme :
CNE= 2014/358 Nom= Omar Moyenne= 12.5
328
L’interface Comparator
Représente une relation d’ordre
329
26
Comparator : exemple
public class Etudiant {
// constructeur
//getters setters
330
Comparator : exemple
public String getCNE() { return CNE; }
@Override
return "CNE="+CNE+"Nom="+nom+"Moyenne="+moyenne;
331
27
Comparator : exemple
import java.util.*;
@Override
return (nom1.compareTo(nom2));
332
Comparator : exemple
import java.util.*;
if (m1==m2) return 0;
else return 1;
333
28
Comparator : exemple
import java.util.*;
public class ComparableTest {
public static void main(String[] args) {
Comparator c = new CompNom();
TreeSet etudiants = new TreeSet(c);
etudiants.add(new Etudiant("2014/354", "Ali",15.5));
etudiants.add(new Etudiant("2014/358", "Omar",12.5 ));
etudiants.add(new Etudiant("2014/398", "Taha",13.6));
etudiants.add(new Etudiant("2014/253", "Anass",14.3));
Object[] tabEtudiants = etudiants.toArray();
for(Object o: tabEtudiants ){
System.out.println((Etudiant) o);
}
}
}
334
Comparator : exemple
Résultat du programme :
CNE= 2014/354 Nom= Ali Moyenne= 15.5
335
29
Tri Avec ArrayList
La classe ArrayList dispose d’une méthode sort :
Elle prend en paramètre un objet comparator
Exemple :
List list = new ArrayList();
list.add(new Etudiant("2014/354", "Ali", 15.5));
list.add(new Etudiant("2014/358", "Omar", 12.5));
list.add(new Etudiant("2014/398", "Taha", 13.6));
list.add(new Etudiant("2014/253", "Anass", 14.3));
336
337
30
Les génériques
Les génériques sont des collections paramétrables
pour lesquels on précise un type particulier à stocker.
338
Les génériques
Exemple de collection non générique:
ArrayList list = new ArrayList();
Remarque :
Les génériques n'acceptent pas les types primitifs
339
31
Un Set générique : exemple
import java.util.*;
public class GenSetExample {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("one");
set.add("second");
set.add("3rd");
// Cette ligne génère une erreur de compilation
set.add(new Integer(4));
set.add("second");
// Doublon, non ajouté
System.out.println(set);
}
}
340
341
32
Un Map générique : exemple
for (Map.Entry<Integer, String> cv: joueurs.entrySet()) {
System.out.println("Numero : "+cv.getKey()
+" , Position : "+cv.getValue());
}}}
Remarque :
La dernière boucle peut être remplacée par ce qu'on
appelle une opération fonctionnelle comme suit :
joueurs.entrySet().forEach((cv) -> {
System.out.println("Numero : "+cv.getKey()
342
343
33
La sûreté dans les types
Une fois le type d'objet d'un générique est précisé,
le compilateur signale une erreur si un autre type
est ajouté.
Exemple :
public class SuretéDesTypes{
enseignants.add(new Enseignant()); // OK
}}
344
L’invariance
Exemple :
Personne p=new Etudiant() est légal
345
34
Paramètre d'un générique
Un générique tolère des paramètres pour des
traitements qui ne mixent pas les types.
Exemple :
Générique d'objets héritant de la classe Personne
346
347
35
Paramètre d'un générique
public static void main(String[] args) {
afficherNoms (enseignants);
afficherNoms (etudiants );
348
Exemple :
List<? extends Personne> liste2 = enseignants; //OK
liste2.add(new Enseignant ());//Erreur de Compilation!
349
36