Vous êtes sur la page 1sur 76

Java : les collections

Achref El Mouelhi

Docteur de l’université d’Aix-Marseille


Chercheur en Programmation par contrainte (IA)
Ingénieur en Génie logiciel

elmouelhi.achref@gmail.com

H & H: Research and Training 1 / 50


Plan
1 Introduction
2 List
ArrayList
LinkedList
Généricité et construction d’une liste
3 Set
HashSet
LinkedHashSet
TreeSet
4 Map
Hashtable
HashMap
Construction d’entrée et de map
5 Remarques

H & H: Research and Training 2 / 50


Introduction

Java

I c

Les collections, c’est quoi ?
ELH
U
sont des objets
L MO
f E
hre
permettent de regrouper et gérer plusieurs objets
c
c A

H & H: Research and Training 3 / 50


Introduction

Java

Pourquoi ne pas utiliser les tableaux ?

I c

ELH
U
L MO
f E
chre
c A

H & H: Research and Training 4 / 50


Introduction

Java

Pourquoi ne pas utiliser les tableaux ?

Pour plusieurs raisons

Il faut connaitre à l’avance la taille du tableau


I c
Si on veut dépasser la taille déclarée, ilU
faut
H
EcrLéer un nouveau
MOlangages ont proposés
tableau puis copier l’ancien (certains
L
r e E ça reste difficile à manipuler)
l’allocation dynamique fmais
h
decsupprimer ou d’ajouter un élément au milieu du
Il est difficileA
tableau c
Il faut parcourir tout le tableau pour localiser un élément
(problème d’indexation)
Les tableaux ne peuvent contenir des éléments de type différent

H & H: Research and Training 4 / 50


Introduction

Java

Plusieurs types de collections proposés

List : tableaux extensibles à volonté, accessibles via leurs indice


ou valeur
I c

EL
Set : collection qui n’accepte pas de doublons H
O U
Map : collection qui exige une clM
fE L é unique pour chaque élément

h
Queue : collection
c e
grérée comme une file d’attente (FIFO : First In
First Out) A
c

H & H: Research and Training 5 / 50


Introduction

Java

Plusieurs types de collections proposés

List : tableaux extensibles à volonté, accessibles via leurs indice


ou valeur
I c

EL
Set : collection qui n’accepte pas de doublons H
O U
Map : collection qui exige une clM
fE L é unique pour chaque élément

h
Queue : collection
c e
grérée comme une file d’attente (FIFO : First In
First Out) A
c

Tous les imports de ce chapitre sont de java.util.*;

H & H: Research and Training 5 / 50


List

Java

List

I c

ELH
U
L MO
f E
c hre
c A

ArrayList LinkedList Vector

H & H: Research and Training 6 / 50


List ArrayList

Java

I c

ArrayList
ELH
U
Pas de limite de taille
L MO
f E
hre
Possibilité de stocker tout type de données (y compris null)
c
c A

H & H: Research and Training 7 / 50


List ArrayList

Java
Pour créer un ArrayList
ArrayList list = new ArrayList();

I c

ELH
U
L MO
f E
chre
c A

H & H: Research and Training 8 / 50


List ArrayList

Java
Pour créer un ArrayList
ArrayList list = new ArrayList();

Pour ajouter la valeur 3 à la liste


I c

list.add(3);
ELH
U
L MO
f E
chre
c A

H & H: Research and Training 8 / 50


List ArrayList

Java
Pour créer un ArrayList
ArrayList list = new ArrayList();

Pour ajouter la valeur 3 à la liste


I c

list.add(3);
ELH
U
L MO
f E
hre
Pour récupérer la taille de la liste
c
// affiche 1 c A
System.out.println(list.size());

H & H: Research and Training 8 / 50


List ArrayList

Java
Pour créer un ArrayList
ArrayList list = new ArrayList();

Pour ajouter la valeur 3 à la liste


I c

list.add(3);
ELH
U
L MO
f E
hre
Pour récupérer la taille de la liste
c
// affiche 1 c A
System.out.println(list.size());

Pour récupérer un élément de la liste
System.out.println(list.get(0))
// affiche 3

H & H: Research and Training 8 / 50


List ArrayList

Exemple avec ArrayList


package org.eclipse.classes;

import java.util.ArrayList;

public class Main {


public static void main(String[] args) {
ArrayList list = new ArrayList();
I c

list.add(3);
list.add("Bonjour");
ELH
list.add(3.5);
U
list.add(’c’);
L MO
E
for(int i = 0; i < list.size(); i++){
f
hre
System.out.println("valeur d’indice " + i + " : " + list.get(i));
}
c
c A
}
}

H & H: Research and Training 9 / 50


List ArrayList

Exemple avec ArrayList


package org.eclipse.classes;

import java.util.ArrayList;

public class Main {


public static void main(String[] args) {
ArrayList list = new ArrayList();
I c

list.add(3);
list.add("Bonjour");
ELH
list.add(3.5);
U
list.add(’c’);
L MO
for(int i = 0; i < list.size(); i++){
f E
hre
System.out.println("valeur d’indice " + i + " : " + list.get(i));
}
c
c A
}
}

Le résultat est
valeur d’indice 0 : 3
valeur d’indice 1 : Bonjour
valeur d’indice 2 : 3.5
valeur d’indice 3 : c

H & H: Research and Training 9 / 50


List ArrayList

Java
Autres méthodes de ArrayList

add(index,value) : insère value à la position d’indice index

être de type primitif : int)


I c
remove(index) : supprime l’élément d’indice index de la liste (l’index doit

remove(object) : supprime l’objet object de laE


L H
U liste

removeAll() : supprime tous lesL MOde la liste


fE
éléments

c
set(index, object) h r e
: remplace la valeur de l’élément d’indice index de la

c A
liste par object

isEmpty() : retourne true si la liste est vide, false sinon.

contains(object) : retourne true si object appartient à la liste, false


sinon.

...

H & H: Research and Training 10 / 50


List ArrayList

Java
Qu’affiche le programme suivant ?
import java.util.ArrayList;

public class Main {


public static void main(String[] args) {
I c

ArrayList liste = new ArrayList();
liste.add(0);
ELH
U
MO
liste.add("bonjour");
liste.add(2);
f E L
hre
liste.remove(1);
liste.set(1, "bonsoir");
c
c A

for(Object elt : liste) {
System.out.print(elt + " ");
}
}
}

H & H: Research and Training 11 / 50


List ArrayList

Java
Qu’affiche le programme suivant ?
import java.util.ArrayList;

public class Main {


public static void main(String[] args) {
I c

ArrayList liste = new ArrayList();
liste.add(0);
ELH
U
MO
liste.add("bonjour");
liste.add(2);
f E L
hre
liste.remove(1);
liste.set(1, "bonsoir");
c
c A

for(Object elt : liste) {
System.out.print(elt + " ");
}
}
}

0 bonsoir
H & H: Research and Training 11 / 50
List ArrayList

Java

Exercice

Écrire un programme Java qui


I c
1 demande à l’utilisateur de remplir une listeEavec H
L des nombres
positifs de son choix, il s’arrête à laOU
L M saisie de zéro
demande à l’utilisateur fdeE
2

h r e saisir une valeur à supprimer de la liste


c ère occurrence de cette valeur de la liste
supprime laA premi
3

c
4 affiche la nouvelle liste (après suppression de la valeur
demandée)

H & H: Research and Training 12 / 50


List ArrayList

Java

Exercice

Écrire un programme Java qui


I c
1 demande à l’utilisateur de remplir une listeEavec H
L des nombres
positifs de son choix, il s’arrête à laOU
L M saisie de zéro
demande à l’utilisateur fdeE
2

h r e saisir une valeur à supprimer de la liste


c les occurrences de cette valeur de la liste
3

c A
supprime toutes
4 affiche la nouvelle liste (après suppression de la valeur
demandée)

H & H: Research and Training 13 / 50


List ArrayList

Java

Exercice

Écrire un programme Java qui I c



L H
demande à l’utilisateur de remplir une U listeE
MlaO
1 avec des nombres

E L
positifs de son choix, il s’arrête à saisie de zéro
2
h refde saisir une valeur
demande à l’utilisateur
c
3 affiche
A (de toutes les occurrences) de cette valeur
cles positions
dans cette liste

H & H: Research and Training 14 / 50


List ArrayList

Java
Considérons le programme suivant
public class Main {
public static void main(String[] args) {
ArrayList liste = new ArrayList();
liste.add(0);
liste.add(1);
I c

liste.add(2);
liste.add(3);
ELH
for(Object elt: liste) {
U
if (elt.equals(0))
L MO
liste.remove(elt);
f E
hre
}
}
c
c A
}

H & H: Research and Training 15 / 50


List ArrayList

Java
Considérons le programme suivant
public class Main {
public static void main(String[] args) {
ArrayList liste = new ArrayList();
liste.add(0);
liste.add(1);
I c

liste.add(2);
liste.add(3);
ELH
for(Object elt: liste) {
U
if (elt.equals(0))
L MO
liste.remove(elt);
f E
hre
}
}
c
c A
}

Le résultat est l’exception suivante
Exception in thread "main" java.util.ConcurrentModificationException
at java.base/java.util.ArrayList$Itr.checkForComodification(
ArrayList.java:1009)
at java.base/java.util.ArrayList$Itr.next(ArrayList.java:963)
at org.eclipse.test.Main.main(Main.java:15)

H & H: Research and Training 15 / 50


List ArrayList

Java

Solution : interface Iterator


implémentée par la plupart des collections ayant les méthodes
suivantes
I c

permettant de parcourir une collection EL
H
ayant les méthodes suivantes M
OU
f E L
h re true si l’itérateur contient d’autres
hasNext() : retourne
c
c A: retourne l’élément suivant de l’itérateur
éléments
next()
remove() : supprime le dernier objet obtenu par next()
...

H & H: Research and Training 16 / 50


List ArrayList

Résolvons le problème précédent avec les itérateurs

package org.eclipse.classes;

import java.util.ArrayList;
import java.util.ListIterator;

public class Main {


public static void main(String[] args) {
I c

ArrayList<Integer> liste = new ArrayList();
liste.add(0);
ELH
U
MO
liste.add(1);
liste.add(2);
liste.add(3);
f E L
hre
ListIterator<Integer> li = liste.listIterator();
while (li.hasNext()) {
c
c A
Integer elt = li.next();

if (elt.equals(0))
li.remove();
}
System.out.println(liste);
// affiche [1, 2, 3]
}
}

H & H: Research and Training 17 / 50


List LinkedList

Java

LinkedList (liste chaı̂née)


I c
C’est une liste dont chaque élément a deux E rL
H
éférences : une vers
l’élément précédent et la deuxièmeO U
L M vers l’élément suivant.

r
Pour le premier élément,e f E
l’élément précédent vaut null
A h
célément, l’élément suivant vaut null
c
Pour le dernier

H & H: Research and Training 18 / 50


List LinkedList

Java
Exemple avec LinkedList
import java.util.LinkedList;

public class Main {


I c

public static void main(String[]E
H
L {
LinkedList liste = new M O U args)
LinkedList();
liste.add(5); L
f E");
c h r e
liste.add("Bonjour
c A
i = 0; i < liste.size(); i++)
liste.add(7.5f);
for(int
System.out.println("element d’indice " + i + "
= " + liste.get(i));
}
}

H & H: Research and Training 19 / 50


List LinkedList

Java

Autres méthodes de LinkedList


addFirst(object) : insère l’élément object au début de la
liste
I c

H
EL comme dernier
addLast(object) : insère l’élément object
O U
élément de la liste (exactement comme add())
L M
...
h r e fE
A c
c

H & H: Research and Training 20 / 50


List LinkedList

Java

Autres méthodes de LinkedList


addFirst(object) : insère l’élément object au début de la
liste
I c

H
EL comme dernier
addLast(object) : insère l’élément object
O U
élément de la liste (exactement comme add())
L M
...
h r e fE
A c
c
Remarque
On peut parcourir une liste chaı̂née avec un Iterator
Un itérateur est un objet qui a pour rôle de parcourir une collection

H & H: Research and Training 20 / 50


List LinkedList

Java

LinkedList : parcours avec un itérateur


import java.util.LinkedList;
public class Main {
I c

public static void main(String[] args) {
ELH
U
MO
LinkedList liste = new LinkedList();
liste.add(5);
f E L
hre
liste.add("Bonjour ");
c
c A
liste.add(7.5f);

ListIterator li = liste.listIterator();
while(li.hasNext())
System.out.println(li.next());
}
}

H & H: Research and Training 21 / 50


List LinkedList

Java
Qu’affiche le programme suivant ?
import java.util.LinkedList;
public class Main {
public static void main(String[] args) {
LinkedList l = new LinkedList();
l.add(0);
l.add("bonjour");
I c

l.addFirst("premier");
ELH
l.addLast("dernier");
U
String s = "Salut";
l.add(s);
L MO
f E
hre
int value = 2;
l.add(value);
c
c A
l.remove("dernier");
l.remove(s);

l.remove((Object)value);
ListIterator li = l.listIterator();
while(li.hasNext())
System.out.print(li.next() + " ");
}
}

H & H: Research and Training 22 / 50


List LinkedList

Java
Qu’affiche le programme suivant ?
import java.util.LinkedList;
public class Main {
public static void main(String[] args) {
LinkedList l = new LinkedList();
l.add(0);
l.add("bonjour");
I c

l.addFirst("premier");
ELH
l.addLast("dernier");
U
String s = "Salut";
l.add(s);
L MO
f E
hre
int value = 2;
l.add(value);
c
c A
l.remove("dernier");
l.remove(s);

l.remove((Object)value);
ListIterator li = l.listIterator();
while(li.hasNext())
System.out.print(li.next() + " ");
}
}

premier 0 bonjour
H & H: Research and Training 22 / 50
List Généricité et construction d’une liste

Java

On peut utiliser la généricité pour imposer un type à nos listes


LinkedList<Integer> liste = new LinkedList<Integer>();

I c

ELH
U
L MO
f E
chre
c A

H & H: Research and Training 23 / 50


List Généricité et construction d’une liste

Java

On peut utiliser la généricité pour imposer un type à nos listes


LinkedList<Integer> liste = new LinkedList<Integer>();

I c

ELH
U
Ou
L MO
f E
List<Integer> liste = new LinkedList<Integer>();

chre
c A

H & H: Research and Training 23 / 50


List Généricité et construction d’une liste

Java

On peut utiliser la généricité pour imposer un type à nos listes


LinkedList<Integer> liste = new LinkedList<Integer>();

I c

ELH
U
Ou
L MO
f E
List<Integer> liste = new LinkedList<Integer>();

A c hre
c
La même chose pour ArrayList
List<Integer> liste = new ArrayList<Integer>();

H & H: Research and Training 23 / 50


List Généricité et construction d’une liste

Java

Considérons le tableau suivant


Integer [] tab = { 2, 3, 5, 1, 9 };

I c

EL H
Pour convertir le tableau tab en liste
OU
L M
List<Integer> liste = new
r e f ELinkedList(Arrays.asList(tab));
A ch
c

H & H: Research and Training 24 / 50


List Généricité et construction d’une liste

Java

Considérons le tableau suivant


Integer [] tab = { 2, 3, 5, 1, 9 };

I c

EL H
Pour convertir le tableau tab en liste
OU
L M
List<Integer> liste = new
r e f ELinkedList(Arrays.asList(tab));
A ch
c
Ou en plus simple
List<Integer> ent = Arrays.asList(tab);

H & H: Research and Training 24 / 50


List Généricité et construction d’une liste

Java

On peut le faire aussi sans création de tableau


I c

List<Integer> liste = Arrays.asList(2, 7, 1, 3);
ELH
U
L MO
f E
chre
c A

H & H: Research and Training 25 / 50


List Généricité et construction d’une liste

Java

On peut le faire aussi sans création de tableau


I c

List<Integer> liste = Arrays.asList(2, 7, 1, 3);
ELH
U
L MO
f E
Ou
chre
c A

List<Integer> liste = List.of(2, 7, 1, 3);

H & H: Research and Training 25 / 50


List Généricité et construction d’une liste

Java

Exercice 1 : Étant donnée la liste suivante


ArrayList<Integer> liste = new ArrayList(Arrays.
asList(2, 7, 2, 1, 3, 9, 2, 4, 2));
I c
E L H
Écrire un programme Java qui permetO U
dernière occurrence du chiffreL
M de supprimer l’avant
h r e fE 2 de la liste précédente

A c
c

H & H: Research and Training 26 / 50


List Généricité et construction d’une liste

Java

Exercice 1 : Étant donnée la liste suivante


ArrayList<Integer> liste = new ArrayList(Arrays.
asList(2, 7, 2, 1, 3, 9, 2, 4, 2));
I c
E L H
Écrire un programme Java qui permetO U
dernière occurrence du chiffreL
M de supprimer l’avant
h r e fE 2 de la liste précédente

A c
Solution
c
liste.remove(liste.subList(0,liste.lastIndexOf(2)).
lastIndexOf(2));

H & H: Research and Training 26 / 50


Set

Java

Set

I c

ELH
U
L MO
f E
c hre
c A

HashSet TreeSet LinkedHashSet

H & H: Research and Training 27 / 50


Set HashSet

Java

HashSet
I c
Collection utilisant une table de hachage EL H
M OU
f E L
Possibilité de parcourir ce type de collection avec un objet
Iterator
c h re
c A de cet objet un tableau d’Object
Possibilité d’extraire

H & H: Research and Training 28 / 50


Set HashSet

Exemple avec HashSet


package org.eclipse.classes;

import java.util.HashSet;
import java.util.Iterator;

public class Main {


public static void main(String[] args) {
HashSet hs = new HashSet();
I c

hs.add("bonjour");
ELH
hs.add(69);
U
hs.add(’c’);
Iterator it = hs.iterator();
L MO
f E
hre
while(it.hasNext())
System.out.println(it.next());
c
c A
}
}

H & H: Research and Training 29 / 50


Set HashSet

Exemple avec HashSet


package org.eclipse.classes;

import java.util.HashSet;
import java.util.Iterator;

public class Main {


public static void main(String[] args) {
HashSet hs = new HashSet();
I c

hs.add("bonjour");
ELH
hs.add(69);
U
hs.add(’c’);
Iterator it = hs.iterator();
L MO
f E
hre
while(it.hasNext())
System.out.println(it.next());
c
c A
}
}

Le résultat
c
69
bonjour
H & H: Research and Training 29 / 50
Set HashSet

Java
Les éléments ne sont pas ordonnés

HashSet utilise une valeur de hachage (difficile à prédire) calculée pour


chaque élément.

I c
conteneur.
EL H
Cette valeur de hachage détermine l’indice de l’élément dans un tableau

O U
Ainsi, l’ordre des éléments insérésM
fE L n’est naturellement pas conservé.

h r e
c reste coûteux en espace).
Ceci permet d’accéder aux éléments souhaités avec une complexité
c
O(1) en temps
A (mais

H & H: Research and Training 30 / 50


Set HashSet

Java
Les éléments ne sont pas ordonnés

HashSet utilise une valeur de hachage (difficile à prédire) calculée pour


chaque élément.

I c
conteneur.
EL H
Cette valeur de hachage détermine l’indice de l’élément dans un tableau

O U
Ainsi, l’ordre des éléments insérésM
fE L n’est naturellement pas conservé.

h r e
c reste coûteux en espace).
Ceci permet d’accéder aux éléments souhaités avec une complexité
c
O(1) en temps
A (mais

Remarque

Pour avoir un affichage ordonné selon l’ordre d’insertion, on peut utiliser


LinkedHashSet.

H & H: Research and Training 30 / 50


Set HashSet

Java
HashSet : exemple avec conversion en tableau
public class Main {
public static void main(String[] args) {
HashSet hs = new HashSet();
hs.add("bonjour");
I c

hs.add(69);
hs.add(’c’);
ELH
U
MO
Object[] obj = hs.toArray();
for(Object o : obj)
System.out.println(o);
f E L
}
chre
c A
}

H & H: Research and Training 31 / 50


Set HashSet

Java
HashSet : exemple avec conversion en tableau
public class Main {
public static void main(String[] args) {
HashSet hs = new HashSet();
hs.add("bonjour");
I c

hs.add(69);
hs.add(’c’);
ELH
U
MO
Object[] obj = hs.toArray();
for(Object o : obj)
System.out.println(o);
f E L
}
chre
c A
}

Le résultat
c
69
bonjour

H & H: Research and Training 31 / 50


Set LinkedHashSet

Java
Exemple avec LinkedHashSet
public class Main {
public static void main(String[] args) {
LinkedHashSet hs = new LinkedHashSet();
hs.add("bonjour");
I c

hs.add(69);
hs.add(’c’);
ELH
U
MO
Object[] obj = hs.toArray();
for(Object o : obj)
System.out.println(o);
f E L
}
chre
c A
}

H & H: Research and Training 32 / 50


Set LinkedHashSet

Java
Exemple avec LinkedHashSet
public class Main {
public static void main(String[] args) {
LinkedHashSet hs = new LinkedHashSet();
hs.add("bonjour");
I c

hs.add(69);
hs.add(’c’);
ELH
U
MO
Object[] obj = hs.toArray();
for(Object o : obj)
System.out.println(o);
f E L
}
chre
c A
}

Ordre d’affichage = ordre d’insertion
bonjour
69
c

H & H: Research and Training 32 / 50


Set TreeSet

Java

I c
TreeSet
H
ELavec un objet
U
MO
Possibilité de parcourir ce type de collection
Iterator
L
fésEsont automatiquement triés
h r e
Les éléments enregistr
c
c A

H & H: Research and Training 33 / 50


Set TreeSet

Java
Exemple avec TreeSet
public class Main {
public static void main(String[] args) {
TreeSet ts = new TreeSet();
ts.add(5);
ts.add(8);
I c

ts.add(2);
ELH
Iterator it = ts.iterator(); U
while(it.hasNext())
L MO
f
System.out.println(it.next());
E
}
chre
c A
}

H & H: Research and Training 34 / 50


Set TreeSet

Java
Exemple avec TreeSet
public class Main {
public static void main(String[] args) {
TreeSet ts = new TreeSet();
ts.add(5);
ts.add(8);
I c

ts.add(2);
ELH
Iterator it = ts.iterator(); U
while(it.hasNext())
L MO
f
System.out.println(it.next());
E
}
chre
c A
}

Le résultat est ordonné
2
5
8

H & H: Research and Training 34 / 50


Set TreeSet

Java

I c

Les éléments ne sont pas ordonnés
ELH
U
L MO
TreeSet ordonne les données insérées.

h r e fE
Elle n’accepte qu’un seul type.

A c
c

H & H: Research and Training 35 / 50


Map

Java

Map

I c

ELH
U
L MO
f E
chre
c A

Hashtable HashMap TreeMap WeakHashMap

H & H: Research and Training 36 / 50


Map Hashtable

Java

Hashtable

I c

H
Hashtable fonctionne avec un couple (clé,valeur)
EL
Elle utilise une table de hachage
O U
L M
f
Elle n’accepte pas la valeur
r e E null
A
La clé doit être h
cunique
c
Pour la parcourir, on utilise l’objet Enumeration

H & H: Research and Training 37 / 50


Map Hashtable

Java
Exemple avec Hashtable
public class Main {
public static void main(String[] args) {
Hashtable ht = new Hashtable();
ht.put(1, "Java");
ht.put(2, "PHP");
I c

ht.put(10, "C++");
ht.put(17, "Pascal");
ELH
Enumeration e = ht.elements();
U
while(e.hasMoreElements())
L MO
E
System.out.println(e.nextElement());
f
hre
}
}
c
c A

H & H: Research and Training 38 / 50


Map Hashtable

Java
Exemple avec Hashtable
public class Main {
public static void main(String[] args) {
Hashtable ht = new Hashtable();
ht.put(1, "Java");
ht.put(2, "PHP");
I c

ht.put(10, "C++");
ht.put(17, "Pascal");
ELH
Enumeration e = ht.elements();
U
while(e.hasMoreElements())
L MO
E
System.out.println(e.nextElement());
f
hre
}
}
c
c A

Le résultat
C++
Pascal
PHP
Java

H & H: Research and Training 38 / 50


Map Hashtable

Java
put ajoute si la clé n’existe pas, modifie sinon.
public class Main {
public static void main(String[] args) {
Hashtable ht = new Hashtable();
ht.put(1, "Java");
ht.put(2, "PHP");
ht.put(10, "C++");
I c

ht.put(17, "Pascal");
ELH
ht.put(17, "Cobol");
U
Enumeration e = ht.elements();
while(e.hasMoreElements())
L MO
f E
hre
System.out.println(e.nextElement());
}
c
c A
}

H & H: Research and Training 39 / 50


Map Hashtable

Java
put ajoute si la clé n’existe pas, modifie sinon.
public class Main {
public static void main(String[] args) {
Hashtable ht = new Hashtable();
ht.put(1, "Java");
ht.put(2, "PHP");
ht.put(10, "C++");
I c

ht.put(17, "Pascal");
ELH
ht.put(17, "Cobol");
U
Enumeration e = ht.elements();
while(e.hasMoreElements())
L MO
f E
hre
System.out.println(e.nextElement());
}
c
c A
}

Le résultat
C++
Cobol
PHP
Java
H & H: Research and Training 39 / 50
Map Hashtable

Java

Autres méthodes de la classe Hashtable

c
isEmpty() retourne true si l’objet est vide, false sinon.
I
E
contains(value) retourne true si la valeurH
L existe dans la
U
Hashtable, false sinon.
L MO
e f E true si la clé existe dans la
containsKey(key) retourne
h r
A c
Hashtable, false sinon.
c

elements() retourne une énumération des éléments de l’objet
keys() retourne la liste des clés sous forme d’énumération

H & H: Research and Training 40 / 50


Map HashMap

Java

HashMap

I c

H
HashMap fonctionne aussi avec un couple (clé,valeur)
L
Elle utilise aussi une table de hachageUE
M O
HashMap accepte la valeur
f L
Enull
h r e
cunique
c A
La clé doit être
Pour la parcourir, on utilise un objet Set

H & H: Research and Training 41 / 50


Map HashMap

Java
Exemple avec HashMap
package org.eclipse.classes;

import java.util.HashMap;
import java.util.Set;
I c

LH
{E
public class Main {
U
OHashMap();
public static void main(String[] args)
HashMap<Integer, String> hm =M
E L new

hm.put(2, "PHP"); ref


hm.put(1, "Java");

hm.put(10, A c h
"C++");
c
hm.put(17, null);
Set s = hm.entrySet();
Iterator it = s.iterator();
while(it.hasNext())
System.out.println(it.next());
}
}

H & H: Research and Training 42 / 50


Map HashMap

Java

Pour afficher la clé et la valeur, on peut utiliser l’Entry

import java.util.HashMap;
public class Main {
public static void main(String[] args) {
I c

HashMap<Integer, String> hm = new HashMap();
ELH
hm.put(1, "Java");
U
hm.put(2, "PHP");
L MO
hm.put(10, "C++");
f E
hre
hm.put(17, null);
c
c A
for (Entry<Integer, String> entry : hm.entrySet()) {


System.out.println(entry.getKey() + " " + entry.getValue
());
}
}
}

H & H: Research and Training 43 / 50


Map HashMap

Java
Étant donné ce dictionnaire
HashMap<String, Integer> repetition = new HashMap();
repetition.put("Java",2);
repetition.put("PHP",5);
I c

repetition.put("C++",1);
ELH
repetition.put("HTML",4);
U
L MO
f E
Exercice
chre
c A

Écrire un programme Java qui permet de répéter l’affichage de chaque
clé de ce dictionnaire selon la valeur associée

Résultat attendu (l’ordre n’a pas d’importance) :


JavaJava PHPPHPPHPPHPPHP C++ HTMLHTMLHTMLHTML

H & H: Research and Training 44 / 50


Map HashMap

Java
Exercice 2 : Étant donnée la liste suivante :
List list = Arrays.asList(2,5,"Bonjour",true,’c’,"3"
,"b",false,10);

I c
E
Écrire un programme Java qui permet de stocker H
L dans un
dictionnaire (Map) les types contenusO U
dans la liste list ainsi que
le nombre d’éléments de cetteL Mappartenant
re f E liste à chaque type.

c h
c A:
Résultat attendu
Integer=3
Character=1
String=3
Boolean=2

H & H: Research and Training 45 / 50


Map HashMap

Java

Une solution possible

HashMap<String, Integer> compteur = new HashMap<>();


for(Object elt : list) {
I c

String type = elt.getClass().getSimpleName();
if (compteur.containsKey(type)){
ELH
U
MO
compteur.put(type, compteur.get(type)+1);
}
else {
f E L
compteur.put(type, 1);
chre
c A
}
}
for (Entry<String, Integer> entry : compteur.entrySet()) {
System.out.println(entry.getKey() + " " + entry.getValue());
}

H & H: Research and Training 46 / 50


Map Construction d’entrée et de map

Java
Pour créer une entrée, on utilise la méthode entry()
var x = Map.entry(3, "JavaScript");

I c

ELH
U
L MO
f E
chre
c A

H & H: Research and Training 47 / 50


Map Construction d’entrée et de map

Java
Pour créer une entrée, on utilise la méthode entry()
var x = Map.entry(3, "JavaScript");

I c

Pour créer une Map en utilisant plusieurs entrées prédéfinies

E L H
var x = Map.entry(3, "JavaScript");
O U
var z = Map.entry(1, "CSS"); L M
var y = Map.entry(2, "HTML");

h r e f= E
A c
Map<Integer, String> map Map.ofEntries(x,y,z);

H & H: Research and Training 47 / 50


Map Construction d’entrée et de map

Java
Pour créer une entrée, on utilise la méthode entry()
var x = Map.entry(3, "JavaScript");

I c

Pour créer une Map en utilisant plusieurs entrées prédéfinies

E L H
var x = Map.entry(3, "JavaScript");
O U
var z = Map.entry(1, "CSS"); L M
var y = Map.entry(2, "HTML");

h r e f= E
A c
Map<Integer, String> map Map.ofEntries(x,y,z);

c
Pour afficher
for (Entry<Integer, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + " " + entry.getValue());
}

H & H: Research and Training 47 / 50


Map Construction d’entrée et de map

Pour créer une Map et l’initialiser, on peut utiliser la méthode of


Map<Integer, String> map = Map.of(3, "JavaScript",
2, "HTML",
1, "CSS");

for (Entry<Integer, String> entry : map.entrySet()) {

c

System.out.println(entry.getKey() + " " + entry.getValue());
I
}

ELH
U
L MO
f E
chre
c A

H & H: Research and Training 48 / 50


Map Construction d’entrée et de map

Pour créer une Map et l’initialiser, on peut utiliser la méthode of


Map<Integer, String> map = Map.of(3, "JavaScript",
2, "HTML",
1, "CSS");

for (Entry<Integer, String> entry : map.entrySet()) {

c

System.out.println(entry.getKey() + " " + entry.getValue());
I
}

ELH
U
L MO
f E
Pour créer une HashMap et l’initialiser en utilisant la méthode of
re map = new3,HashMap(Map.of(
c h
HashMap<Integer, String>

c A "JavaScript",
2, "HTML",
1, "CSS")
);

for (Entry<Integer, String> entry : map.entrySet()) {


System.out.println(entry.getKey() + " " + entry.getValue());
}

H & H: Research and Training 48 / 50


Remarques

Java
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main {


public static void main(String[] args) {
List<String> lettres = new ArrayList<String>();
I c

lettres.add("d");
ELH
lettres.add("b");
U
lettres.add("a");
lettres.add("c");
L MO
f E
hre
Collections.sort(lettres); // pour trier la liste
System.out.println(lettres);
c
c A
Collections.shuffle(lettres); // pour desordonner la liste


System.out.println(lettres);
List<String> sub = lettres.subList(1, 2); // extraire une sous-
liste
System.out.println(sub);
Collections.reverse(sub); // pour trier la liste dans le sens
decroissant
System.out.println(sub);
}
}
H & H: Research and Training 49 / 50
Remarques

Java
ArrayList vs LinkedList

ArrayList est plus rapide pour l’opération de recherche (get)

LinkedList est plus rapide pour des opérations d’insertion et de suppression


I c

ELH
LinkedList utilise un chaı̂nage double (deux pointeurs) d’où une
consommation de mémoire plus élevée.
U
L MO
f E
chre
c A

H & H: Research and Training 50 / 50


Remarques

Java
ArrayList vs LinkedList

ArrayList est plus rapide pour l’opération de recherche (get)

LinkedList est plus rapide pour des opérations d’insertion et de suppression


I c

ELH
LinkedList utilise un chaı̂nage double (deux pointeurs) d’où une
consommation de mémoire plus élevée.
U
L MO
f E
Remarques
A c hre
c
lorsqu’on veut rechercher ou accéder à une valeur via une clé de
Map à utiliser
recherche

Set à utiliser si on n’accepte pas de doublons dans la collection

List accepte les doublons permet l’accès à un élément via son indice et les
éléments sont insérés dans l’ordre (pas forcément triés)

H & H: Research and Training 50 / 50

Vous aimerez peut-être aussi