Vous êtes sur la page 1sur 12

POO Avancée : PROGRAMMATION OBJET AVANCEE

Spécialité : DSI 2.2

Chapitre I : Les collections

I. Introduction

Une collection est une structure de données dynamique qui permet de gérer être n'importe
quel ensemble d'éléments de même type.

Tableaux : Collections :
- Non redimensionnables - Choix de l'implémentation (complexité)
- L'insertion nécessite un décalage et de l'interface
- Les indices doivent être des entiers - Structures dynamiques
- Légers en mémoire et accès en O(1) - Algorithmes communs
- Plus gourmandes en mémoire

II. Les types des collections


La figure suivante illustre la hiérarchie des interfaces des collections en JAVA

Figure1- Java Collection Interfaces

Les classes et les interfaces de gestion de collections se situent dans le paquetage java.util.Les
collections implémentent toutes une interface. Celle-ci comprend un ensemble de méthodes
(dont certaines sont optionnelles) visant la gestion des collections. Il existe trois grandes
familles de collections, chacune définie par une interface de base :

• Les listes (interface List) sont des structures capables de contenir des objets de
différents types accessibles séquentiellement. Les objets de type List servent à stocker
des objets sans condition particulière sur la façon de les stocker. Ils acceptent toutes les
valeurs, même les valeurs null
• Les ensembles (interface Set) sont des structures contenant des éléments non dupliqués
dont l'accès reste très performant. Les objets de types Set sont donc un peu plus
restrictifs (pas de doublons) ce qui est pratique pour une liste d'éléments uniques, par
exemple.
• Les tableaux associatifs (interface Map) sont des structures qui permettent de lier un
objet clé à un autre objet valeur. Elles fonctionnent avec un système « clé - valeur »
pour ranger et retrouver les objets qu'elles contiennent
POO Avancée : PROGRAMMATION OBJET AVANCEE
Spécialité : DSI 2.2

III. Les listes (List)

Figure2- Java Collection interfaces and concrete classes

III.1 Implémentations et méthodes


Cette interface est implémentée par un certain nombre de collections, et garantit que ces classes
implémenteront l'ensemble des méthodes. Elle dérive de l'interface Collection. Les éléments
sont indexés (i.e. numérotés de la même façon qu'un tableau est indicé).

Méthodes sur les listes


Type Méthode Rôle
boolean add(Object o) Ajouter un objet à la fin de la liste
boolean add(int index, Object o) Ajouter un objet à l'index indiqué.
boolean addAll(Collection c) Ajouter tous les objets d'une autre collection à la fin de la liste.
boolean addAll(int index, Collection c) Ajouter tous les objets d'une autre collection à l'index indiqué.
Object get(int index) Retourner l'objet à l'index indiqué.
int indexOf(Object o) Retourner le premier index de l'objet indiqué.
int lastIndexOf(Object o) Retourner le dernier index de l'objet indiqué.
Object remove(int index) Supprimer l'objet à l'index indiqué.
Object set(int index, Object o) Remplacer l'objet à l'index indiqué. L'objet précédent est retourné.
int size() Retourner le nombre d'éléments de la liste.
List subList(int fromIndex,int toIndex) Retourner une sous-liste de celle-ci.
POO Avancée : PROGRAMMATION OBJET AVANCEE
Spécialité : DSI 2.2

➔ Les différentes implémentations


• ArrayList (Tableau redimensionnable) Cette classe est un tableau dont la taille croit
lorsque des éléments sont ajoutés.
• Vector (Tableau redimensionnable) Cette classe a été créée avant la classe ArrayList.
C’est un tableau dont la taille croit lorsque des éléments sont ajoutés.
NB : Cette classe est "thread-safe", c'est-à-dire que plusieurs processus peuvent
l'utiliser en même temps sans risque.
• LinkedList (Listes chaînées) Cette classe implémente l'interface List en chaînant les
éléments (liste doublement chaînée). Les méthodes ajoutées sont :
Type Méthode Rôle
Void addFirst(Object o) Ajoute un élément en début de liste

Void addLast(Object o) Ajoute un élément en fin de liste.

Object getFirst() Retourne l'élément en début de liste.

Object getLast() Retourne l'élément en fin de liste

Object removeFirst() Supprime et retourne l'élément en début de liste

Object removeLast() Supprime et retourne l'élément en fin de liste

LinkedList VS ArrayList/Vector:
Contrairement aux LinkedList, les ArrayList/ Vector sont rapides en lecture, même avec un
gros volume d'objets. Elles sont cependant plus lentes si vous devez ajouter ou supprimer des
données en milieu de liste. Pour résumer, si vous effectuez beaucoup de lectures sans vous
soucier de l'ordre des éléments, optez pour une ArrayList ou un Vector ; en revanche, si vous
insérez beaucoup de données au milieu de la liste, optez pour une Linkedlist.

III.2 Les collections génériques


Avant la version 5 de Java, les collections ne permettaient que de stocker des instances de la
classe Object sans pouvoir mieux préciser le type des éléments :
LinkedList maListe = new LinkedList();

Depuis la version 5, nous pouvons préciser le type des éléments contenus dans la collection
(si tous les éléments sont de même type) en écrivant :
LinkedList<Type> maListe = new LinkedList<Type>();
➔ Exemple :
LinkedList<String> maListe = new LinkedList<String>();

III.3 Comment parcourir une collection?


Pour parcourir et afficher le contenue des collections, il est possible d’utiliser
• Les Itérateurs : ce sont objets qui permettent de parcourir les collections. En plus de
l'interface Collection, les classes List et Set et Queue étendent l'interface Iterator.
Le principe est simple : on récupère un itérateur positionné avant le premier élément de
la collection par la méthode iterator(), on navigue de proche en proche par la méthode
next() de l’itérateur en s’assurant qu’il existe des éléments suivants par hasNext()
POO Avancée : PROGRAMMATION OBJET AVANCEE
Spécialité : DSI 2.2

Par exemple, le parcours d'une liste nommée maListe peut se faire de la manière
suivante :
Iterator iterateur= maListe.iterator();
while (iterateur.hasNext()) System.out.println(iterateur.next());

Remarque : les Maps n'implémentant pas l'interface Iterable, ils ne permettent pas d'être
parcourus à l'aide d'un itérateur
• La boucle FOR-EACH : La version 5 de Java introduit une nouvelle boucle qui
simplifie le parcours d’une collection : la boucle for-each.
Par exemple, le parcours d'une liste d’entiers, nommée maListe peut se faire de la
manière suivante

for (Integer entier : maListe) System.out.println( entier) ;

Cette boucle est d’un usage très intuitif. Cependant, on remarquera qu’il n’est pas possible de
supprimer des éléments de la collection si on la parcoure avec un for-each.

• Parcours simple (Seulement pour les listes)

Il est possible de parcourir une collection de type liste, de la même façon (ou presque) qu’on
parcoure un tableau. Par exemple, le parcours d'une liste d’entiers, nommée maListe peut se
faire de la manière suivante :

for (int i = 0; i < maListe.size(); i++)


System.out.println(maListe.get(i));

Exemple complet :

public class TestParcoursCollection {


public static void main(String[] args) {

LinkedList<String> maListe = new LinkedList<String>(); maListe.add("Bonjour =)!");


maListe.add("ISET Beja");;

// Parcours simple: Seulement pour les collections de type Liste


for (int i = 0; i < maListe.size(); i++) { System.out.println(maListe.get(i));
}

// Parcours avec For-Each


for (String chaine : maListe) System.out.println(chaine) ;

// Parcours avec un itérateur


Iterator<String> iterator = maListe.iterator();
while (iterator.hasNext()) { System.out.println(iterator.next());
}

}
}
POO Avancée : PROGRAMMATION OBJET AVANCEE
Spécialité : DSI 2.2

III.4 Les méthodes de la classe Collections


La classe Collections définit des méthodes statiques qui seront utilisées pour réaliser différents
traitements sur les collections. Certaines de ces méthodes ne s'appliquent que sur des listes ;
c'est le cas de:
• sort : trie les éléments de la liste dans l'ordre naturel
• shuffle : ordonne de manière aléatoire les éléments de la liste
• reverse : inverse l'ordre des éléments de la liste
• fill : réinitalise la liste avec une valeur définie
• copy : copie une liste dans une autre.

➔ Exemple :
LinkedList<String> maListe = new LinkedList<String>();
Collections.sort(maListe);

NB : Cet exemple fonctionne que si les éléments dans la liste sont de type Comparable, comme
int, String, Date…

IV. Les tableaux associatifs (Map)

Un autre type de structure de données utilisable en Java est le Map. Une map permet de créer
un ensemble de couples clé/valeur (On parle aussi de tableaux associatifs), la clé permettant de
retrouver rapidement la valeur qui lui a été associée. Les clés sont des objets uniques pouvant
être NULL; Les valeurs peuvent être multiples et NULL.
On retrouve principalement quatre classes qui implémentent l'interface Map : HashTable,
HashMap, LinkedHashMap et TreeMap.

Figure3 - JAVA Map interface and concrete classes


POO Avancée : PROGRAMMATION OBJET AVANCEE
Spécialité : DSI 2.2

Les principales méthodes de cette interface sont :

Type Méthode Rôle


void clear() Vider la collection.
boolean containsKey(Object key) Teste si la clé existe, c'est à dire associée à une valeur.

boolean containsValue(Object value) Teste si la valeur existe.

Set entrySet() Retourne l'ensemble des associations clés-valeurs

Set keySet() Retourne l'ensemble des clés.

Collection values() Retourne la collection de valeurs

Object
Associe la clé à la valeur spécifiée, et retourne la valeur
put(Object key, Object value) précédemment associée.
boolean putAll(Map m) Ajouter tous les objets d'une autre collection à celle-ci.

Object
Retourne la valeur associée à la clé spécifiée, ou null si
get(Object key) non trouvé.
Object remove(Object key) Supprime l'objet associé à la clé, et retourne cet objet.

Boolean isEmpty() Tester si la collection est vide.

int size() Retourne le nombre de clés.

➔ Les différentes implémentations


• HashMap : C’est l'implémentation concrète la plus standard, elle est adaptée à la
plupart des situations. Elle accepte la valeur null et elle n'est pas Thread Safe
• HashTable : Cette classe ne diffère que très peu de la HashMap. Elle implémente
l'interface Map de manière synchronisée (Thread Safe) et n’accepte pas la valeur null.
• LinkedHashMap : HashTable + Liste chainée
• TreeMap : La classe TreeMap ajoute une fonction de tri des clés de la Map. L'ordre des
clés peut être choisi en donnant une instance de java.util.Comparator sinon c'est l'ordre
naturel des clés qui sera utilisé.

Comment instancier une Map ?

Map<TypeClés,TypeValeurs> map = new ClasseImplMap<TypeClés,TypeValeurs>()

Comment parcourir une Map ?


On peut parcourir une collection de type Map au moyen d'Iterator. Pour cela, il suffit de
récupérer soit les clés avec la méthode keySet() soit les valeurs avec la méthode values() et
d'appeler ensuite la méthode iterator() sur la collection
POO Avancée : PROGRAMMATION OBJET AVANCEE
Spécialité : DSI 2.2

Exemple :
public class TestMap {
public static void main(String[] args) {

HashMap<Integer,String> map = new HashMap<Integer,String>() ; map.put(1, "Bonjour");


map.put(2, "Bonsoir"); map.put(3, "Bonne
journée");

// Parcours de valeurs avec un itérateur


for (Iterator<String> i = map.values().iterator() ; i.hasNext() ;) System.out.println(i.next());

// Parcours de clés avec un itérateur


for (Iterator<Integer> i = map.keySet().iterator() ; i.hasNext() ; ) System.out.println(i.next());

// Parcours de clés avec For-each


for(Integer x: map.keySet())
System.out.println(x);

// Parcours de valeurs avec For-each


for(String s: map.values())
System.out.println(s);
}
}

Les objets Maps ont comme point faible majeur : leur rapport conflictuel avec la taille des
données à stocker. En effet, plus vous aurez de valeurs à mettre dans un objet Map, plus celles-
ci seront lentes et lourdes : logique, puisque par rapport aux autres collections, il stocke une
donnée supplémentaire par enregistrement.

Résumé et comparatif :

Type Classe Description


Les ArrayList représente un tableau dynamique dont la taille peut varier.
listes Vector représente un tableau dynamique dont la taille peut varier et dont
les valeurs ne peuvent être nulles. Thread-safe
LinkedList représente une liste doublement chainée. Cette classe peut être
utilisable comme une pile LIFO ou une file FIFO.
Queue représente un mécanisme de pile de type FIFO.
Les HashMap représente un tableau associatif dont une clé et des valeurs
Maps peuvent être nulles.
Hashtable représente un tableau associatif dont les clés ne peuvent être
nulles. Thread-safe.
LinkedHashMap représente un tableau associatif sous forme d’une liste
doublement chainée.
TreeMap représente un tableau associatif dont les clés sont classées en
ordre naturel croissant (selon les clés).
POO Avancée : PROGRAMMATION OBJET AVANCEE
Spécialité : DSI 2.2

ArrayList Vector LinkedList Hashtable LinkedHashMap HashMap TreeMap


Null √ √ √ X √ √ √
Duplicate √ √ √ X X X X
Sorted
Result
X X X X X X √
Retrieval
order
same as √ √ √ X √ X X
insertion
POO Avancée : PROGRAMMATION OBJET AVANCEE
Spécialité : DSI 2.2

TD1: Les collections

Exercice 1
1. Créer un programme Java qui crée une collection (ArrayList) de noms de pays puis
alimenter cette collection avec quelques valeurs et afficher la taille de la collection
2. Compléter le programme pour afficher le contenu de la collection (Utiliser trois méthodes
différentes).
3. Trouver une méthode pour vider la collection et modifier votre programme pour afficher
un message d’erreur lorsqu’elle est vide et afficher le contenu lorsqu’elle n’est pas vide.
4. Après avoir de nouveau alimenté votre liste de pays, modifiez le nom d’un pays et
affichez de nouveau la liste des pays.
Indication: Pour modifier le nom, il faut supprimer un élément (remove) et en ajouter un autre
(add). Il y a plusieurs méthodes pour ajouter ou supprimer des éléments dans une collection de
type ArrayList. Choisissez celle que vous voulez!
5. Triez votre collection et ré-affichez la liste des pays
Indication: ¨Pour trier une ArrayList, vous pouvez utiliser la méthode sort de Collections avec
la syntaxe suivante : Collections.sort(uneArrayList)

Exercice 2
Ecrire un programme java utilisant les listes chaînées (LinkedList) et qui réalise les opérations
suivantes:

1. Construire une liste A contenant 4 noms (chaînes de caractères). Faire de même pour une
autre liste B contenant 6 noms.
2. Rajouter la chaine "Hello World" à la fin de A.
3. Rajouter la chaine " Bonjour" au début de B
4. Afficher le premier élément de la liste A
5. Afficher le dernier élément de la liste B
6. Rajouter les éléments de B à la fin de A.
7. Retirer de la liste B un élément sur deux.
8. Afficher le contenue de la liste A de deux façons différentes

Exercice 3
On souhaite gérer un ensemble d'étudiants. Chaque étudiant sera défini par une classe Etudiant
et devra présenter les informations suivantes: une matricule, un nom et une liste de notes (de
taille indéfinie).
La classe Note permettra de contenir pour chaque matière, l'intitulé de la matière ainsi que la
note obtenue. La liste des notes de chaque étudiant seront stockées dans une ArrayList.

1. Définir la classe Note qui comporte les éléments suivants :


- Un attribut privé nommé valeurNote de type double
- Un attribut privé nommé matière de type String
- Un constructeur permettant d’initialiser tous les attributs de la classe Note
- Les getters et les setters de tous les attributs
POO Avancée : PROGRAMMATION OBJET AVANCEE
Spécialité : DSI 2.2

- La méthode toString()

2. Définir la classe Etudiant qui comporte les éléments suivants :


- Un attribut privé nommé matricule de type Integer
- Un attribut privé nommé nom de type String
- Un attribut privé nommé listNotes de type ArrayList
- Un constructeur permettant d’initialiser la matricule et le nom de l’étudiant
- Les getters et les setters des attributs matricule et nom
- La méthode addNote(Note note) permettant d'ajouter une note à l'étudiant
- La méthode toString() : cette méthode doit afficher le nom , la matricule de l’étudiant
et la liste de toute ses notes.
3. Définir la classe TestEtudiant qui comporte une fonction main permettant de :

- Créer un étudiant nommé « Mohamed Tounsi » avec la matricule « 18471256 »


- Ajouter la liste des notes suivantes à cet étudiant :
• POO : 15/20
• Big Data : 12/20
• Techniques de communication : 18/20
• Certification Oracle : 16/20
- Afficher les caractéristiques de cet étudiant
- Proposer une solution pour trier la liste des notes.

Exercice 4
Développez une application qui permet de mémoriser dans une HashMap les données (cin :
Integer , nom : String, prénom : String , adresse : String, date de naissance : Date) d'étudiants.
Utilisez le numéro CIN comme clé.

Votre code saura effectuer les opérations suivantes :


1. Ajouter plusieurs étudiants à la HashMap
2. Afficher toutes les données de tous les étudiants (CIN inclus)
3. Rechercher un étudiant (par son CIN)
4. Supprimer un étudiant (trouvé par son CIN)
5. Rechercher et afficher tous les étudiants d'une classe

Essayez d'ajouter plusieurs fois le même étudiant / la même clé. Que remarquez-vous ?
Remplacez la structure HashMap par TreeMap. Quelles modifications faut-il faire ?
Quelles différences voyez-vous dans votre programme ?

Exercice 5
On souhaite implémenter un annuaire électronique, qui donne pour chaque nom de contact,
ses coordonnées (N°tel & Adresse).
1. Définir la classe Coordonnees, composée de :
• Deux attributs Tel et Adr de type String
• Un constructeur qui permet d’initialiser tous les attributs
• Les getters et les setters de tous les attributs.
• La méthode toString()
POO Avancée : PROGRAMMATION OBJET AVANCEE
Spécialité : DSI 2.2

2. Définir la classe Annuaire qui gère l’annuaire électronique à l’aide d’une collection
de type HashMap. Cette collection associe à chaque nom, un objet de type
Coordonnees. La classe Annuaire comporte les éléments suivants :
• Un attribut privée listAnnuaire de type HashMap. Utiliser le nom contact (de
stype String) comme clé et ses coordonnées (de type Coordonnees ) comme
valeur.
• public ajouter (String N, Coordonnees C) : Ajout d’un nouveau contact
• public afficherCoord (String N): Affichage des coordonnées d’un contact
• public modifierCoord (String N): Modification des coordonnées d’un contact
• public supprimer (String N): Suppression d’un contact
• public listerNoms (): Affichage de la liste des contacts (tous les noms).
• public listerTel ():Affichage de les liste des N° de Tel de l’annuaire.
• public listerAdr ():Affichage de la liste des Adresses de l’annuaire.
• public afficherAnnuaire ():Affichage de la totalité de l’annuaire.

3) Ecrire un programme principal, présentant un menu pour la gestion d’un annuaire


électronique. Tester toutes les méthodes de la classe Annuaire.

Exercice 6
On souhaite gérer un ensemble d'étudiants. Chaque étudiant sera défini par une classe
Etudiant et devra présenter les informations suivantes:
- une matricule
- un nom
- une liste de notes (de taille indéfinie).

2. Définir la classe Etudiant qui comporte les éléments suivants :


- Un attribut privé nommé matricule de type Integer
- Un attribut privé nommé nom de type String
- Un attribut privé nommé listNotes de type HashMap<String,Integer>. Utiliser le
nom de la matière comme clé et la note de l’étudiant comme valeur.
Exemple : < POA, 18 >
- Un constructeur permettant d’initialiser la matricule et le nom de l’étudiant
- Les getters et les setters des attributs matricule et nom
- La méthode addNote(Double note, String nomMatiere) permettant d'ajouter une note
à l'étudiant
- La méthode toString() : cette méthode doit afficher le nom , la matricule de l’étudiant
et la liste de toute ses notes.

3. Définir la classe TestEtudiant qui comporte une fonction main permettant de :


- Créer un étudiant nommé « Mohamed Tounsi » avec la matricule « 18471256 »
- Ajouter la liste des notes suivantes à cet étudiant :
• POO : 15/20
• Big Data : 12/20
• Techniques de communication : 18/20
• Certification Oracle : 16/20
- Afficher les caractéristiques de cet étudiant
- Proposer une solution pour trier la liste des notes.
POO Avancée : PROGRAMMATION OBJET AVANCEE
Spécialité : DSI 2.2

Exercice 7
Développez un dictionnaire anglais-français (bi-directionnel) en employant la structure
prédéfinie TreeMap.
Sur quelles difficultés tombez-vous, si vous voulez ajouter plusieurs traductions pour le même
mot ?

Vous aimerez peut-être aussi