Collections : Tables associatives



Documents pareils
LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Chapitre 10. Les interfaces Comparable et Comparator 1

Package Java.util Classe générique

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Programmation Par Objets

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Programmation Orientée Objet Java

Programmation Orientée Objet

Chapitre V. Les classes : Object, Vector, etc.

Programmation par les Objets en Java

Les structures de données. Rajae El Ouazzani

Projet de programmation (IK3) : TP n 1 Correction

Programmer en JAVA. par Tama

Corrigés des premiers exercices sur les classes

4. Groupement d objets

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Les arbres binaires de recherche

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Apprendre la Programmation Orientée Objet avec le langage Java (avec exercices pratiques et corrigés)

Introduction. Les méthodes. Les méthodes. Identité et égalité. Identité et égalité. La copie d'objets. Identité et égalité.

Arbres binaires de recherche

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Corrigé des exercices sur les références

Chapitre VI- La validation de la composition.

ARBRES BINAIRES DE RECHERCHE

Utilisation d objets : String et ArrayList

Un ordonnanceur stupide

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

OpenPaaS Le réseau social d'entreprise

Programmation Objet I

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

TD/TP PAC - Programmation n 3

Programmation avec des objets : Cours 7. Menu du jour

Java 1.5 : principales nouveautés

Une introduction à Java

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Java Licence Professionnelle CISII,

Objets et Programmation. origine des langages orientés-objet

Généricité. en Java. (polymorphisme paramétrique) Philippe GENOUD UJF Janvier

Présentation. Au programme. Fonctionnement. A l issue de ce module vous devriez...

Auto-évaluation Programmation en Java

RMI le langage Java XII-1 JMF

Cours 1: Java et les objets

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Héritage presque multiple en Java (1/2)

TD3: tableaux avancées, première classe et chaînes

MapReduce. Malo Jaffré, Pablo Rauzy. 16 avril 2010 ENS. Malo Jaffré, Pablo Rauzy (ENS) MapReduce 16 avril / 15

Threads. Threads. USTL routier 1

Premiers Pas en Programmation Objet : les Classes et les Objets

4. Outils pour la synchronisation F. Boyer, Laboratoire Lig

Certificat Big Data - Master MAthématiques

Plan du cours. Historique du langage Nouveautés de Java 7

P r ob lé m a t iq u e d e la g é n é r icit é. Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 )

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

ACTIVITÉ DE PROGRAMMATION

TD/TP PAC - Programmation n 3

Introduction au langage de programmation Java

TP1 : Initiation à Java et Eclipse

7 Développement d une application de MapReduce

Exercices sur les interfaces

Notes de cours Practical BigData

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

Solutions du chapitre 4

Introduction à MapReduce/Hadoop et Spark

F. Barthélemy. 17 mai 2005

Diagramme de classes

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Généralités sur le Langage Java et éléments syntaxiques.

Recherche dans un tableau

Applet pour visualiser les variables «automate» notifiées

1 Recherche en table par balayage

Par Laurent DESECHALLIERS. Mastère Spécialisé en Management de Projets en Milieu Industriel. CESI de Rouen Promotion 2002/2003.

Programmation Objet II

Application web de gestion de comptes en banques

Tp 1 correction. Structures de données (IF2)

Java et les bases de données: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java. Michel Bonjour

Création d objet imbriqué sous PowerShell.

Chapitre 2. Classes et objets

Plan. Exemple: Application bancaire. Introduction. OCL Object Constraint Language Le langage de contraintes d'uml

Modélisation PHP Orientée Objet pour les Projets Modèle MVC (Modèle Vue Contrôleur) Mini Framework

Design patterns. Design patterns - définition. Design patterns - avantages

Cours 1 : La compilation

Environnements de développement (intégrés)

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Génie Logiciel avec Ada. 4 février 2013

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

as Architecture des Systèmes d Information

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

API04 Contribution. Apache Hadoop: Présentation et application dans le domaine des Data Warehouses. Introduction. Architecture

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Langage Java. Classe de première SI

Programmation par composants (1/3) Programmation par composants (2/3)

Transcription:

Table associative Collections : Tables associatives Théorie et pratique de la programmation Michel Schinz 2013-03-18 Rappel : une table associative ou dictionnaire (map ou dictionary en anglais) est une collection associant des valeurs à des clefs. Les opérations principales d une table associative sont : l ajout d une association clef valeur, le remplacement d'une valeur associée à une clef, la suppression d une clef, et donc de la valeur associée, la recherche de la valeur associée à une clef. 1 2 Exemples Interface Quelques exemples de tables associatives : Clef Valeur type des clefs type des valeurs Encyclopédie Annuaire téléphonique Fonction mathématique Terme Nom Valeur du domaine Définition Numéro de téléphone Valeur du codomaine public interface Map<K, V> { boolean isempty(); int size(); void put(k key, V value); void remove(k key); V get(k key); boolean containskey(k key); Tableau (p.ex. en Java) Index Elément du tableau 3 4

Utilisation En faisant l'hypothèse qu'il existe une classe PN modélisant les numéros de téléphone (phone number), on peut utiliser une table associative pour gérer un annuaire ainsi : Map<String, PN> pbook = ; pbook.put("jean", new PN("078 123 45 69")); pbook.put("marie", new PN("079 157 78 89")); pbook.put("ursule", new PN("026 688 87 98")); System.out.println("Le numéro de Jean est " + pbook.get("jean")); pbook.put("marie", new PN("077 554 12 55")); pbook.remove("ursule"); Mises en œuvre 5 6 Ensembles et tables Mises en œuvres Les ensembles et les tables associatives sont très similaires : Un ensemble peut être vu comme une table associative dans laquelle aucune information n'est associée aux clefs. C-à-d que seule la présence ou l'absence d'une clef importe. A l'inverse, une table associative peut être vue comme un ensemble de paires clef/valeur. Dès lors, les techniques de mise en œuvre examinées pour les ensembles peuvent être également utilisées pour les tables associatives. Pour les tables associatives, nous examinerons trois des quatre mises en œuvres examinées pour les ensembles, à savoir : les listes, les arbres binaires de recherche, les tables de hachage. 7 8

Paires clef/valeur Dans chacune des mises en œuvres des tables associatives examinées, les paires clef/valeur jouent un rôle très important. Pour respecter la terminologie utilisée dans l'api Java, nous appellerons de telles paires des entrées (entries). Les classes les mettant en œuvre auront toutes l'aspect suivant : class Entry<K, V> { public final K key; public V value; Elles comporteront en plus des liens vers d'autres entrées (successeur pour les listes, enfants pour les arbres). Mise en œuvre 1 : liste associative 9 10 Liste associative Exemple tête clef valeur Une liste associative est une liste d'entrées composées chacune d une clef et d une valeur. Les entrées d une liste associative ne sont en général pas triées. Les opérations de base insertion, suppression, recherche sont donc réalisées par parcours linéaire de la liste. Leur complexité est ainsi en O(n). Jean 078 123 45 69 Abel 078 255 45 58 Marie 079 157 78 89 Laure 079 588 78 92 Ursule 026 688 87 98 11 12

Mise en œuvre en Java Code (1) Les listes associatives sont mises en œuvre par la classe AList, très proche de la classe LinkedList présentée plus tôt. Les entrées, modélisées par la classe imbriquée statique Entry, remplacent les nœuds de la liste. class AList<K, V> implements Map<K, V> { private Entry<K, V> head = null; private static class Entry<K, V> { public Entry<K, V> next; public final K key; public V value; public Entry(Entry<K, V> next, K key, V value) { 13 14 Code (2) class AList<K, V> implements Map<K, V> { private Entry<K, V> head = null; public void put(k k, V v) { Entry<K, V> e = entryforkey(k); if (e!= null) { e.value = v; else { remplacement de la valeur existante! head = new Entry<>(head, k, v); ++size; Code (3) class AList<K, V> implements Map<K, V> { private Entry<K, V> head = null; public V get(k key) { Entry<K, V> e = entryforkey(key); return (e == null? null : e.value); public boolean containskey(k key) { return entryforkey(key)!= null; private Entry<K, V> entryforkey(k key) { //??? 15 16

Code (4) class AList<K, V> implements Map<K, V> { private Entry<K, V> head = null; public void remove(k key) { //??? Mise en œuvre 2 : arbre de recherche 17 18 Arbres de recherche Table associative (a.b.r.) Utiliser un arbre binaire de recherche (a.b.r.) pour mettre en œuvre une table associative est très simple : il suffit de ne prendre que les clefs en considération et d ignorer les valeurs pour la comparaison! Dans un tel arbre de recherche, les clefs de tous les éléments du fils gauche sont strictement plus petites que la clef de l'élément à la racine ; les clefs de tous les éléments du fils droit sont strictement plus grandes que la clef de l'élément à la racine. clef valeur Jean 078 123 45 69 Abel 078 255 45 58 Marie 079 157 78 89 Laure 079 588 78 92 Ursule 026 688 87 98 19 20

Diagramme de classes Code (1) Map<K,V> seules les clefs doivent être comparables! s, g 1 1 Node<K,V> K key V value Tree<K,V> root 1 1 Leaf<K,V> ici, les nœuds sont les entrées! TreeMap<K,V> class TreeMap<K extends Comparable<K>, V> implements Map<K, V> { private Tree<K, V> root = new Leaf<K, V>(); public boolean containskey(k key) { return root.nodeforkey(key)!= null; // interface Tree, classes Node et Leaf // imbriquées statiquement 21 22 Code (2) : arbres private static interface Tree<K extends Comparable<K>, V> { public Node<K, V> nodeforkey(k key); Code (3) : nœuds private static class Node<K extends Comparable<K>, V> implements Tree<K, V> { private final K key; private V value; private Tree<K, V> s, g; public Node<K, V> nodeforkey(k k) { int c = k.compareto(key); if (c < 0) return s.nodeforkey(k); else if (c > 0) return g.nodeforkey(k); else return this; 23 24

Code (4) : feuilles private static class Leaf<K extends Comparable<K>, V> implements Tree<K, V> { public Node<K, V> nodeforkey(k k) { return null; Mise en œuvre 3 : table de hachage 25 26 Table de hachage Table associative (hachage) clef valeur Utiliser des tables de hachage pour mettre en œuvre des tables associatives est très simple : il suffit de ne prendre que les clefs en considération et d ignorer les valeurs lors du hachage et de la comparaison. 0 1 2 Jean 078 123 45 69 Abel 078 255 45 58 Marie 079 157 78 89 3 Ursule 026 688 87 98 Laure 079 588 78 92 27 28

Diagramme de classes Code (1) Map<K,V> HashMap<K,V> 1 table * Entry<K,V> K key V value 1 1 next class HashMap<K, V> implements Map<K, V> { private Entry<K, V>[] table = ; private static class Entry<K, V> { public Entry<K, V> next; public final K key; public V value; public Entry(Entry<K, V> next, K key, V value) { 29 30 Code (2) class HashMap<K, V> implements Map<K, V> { private Entry<K, V>[] table = ; public void put(k k, V v) { int i = Math.abs(k.hashCode())%table.length; Entry<K, V> e = entryforkey(k, i); if (e!= null) { e.value = v; else { table[i] = new Entry<>(table[i], k, v); ++size; quasi-identique à la version des listes associatives. Tables associatives dans l'api Java 31 32

Tables associatives de l'api Set et Map Le paquetage java.util contient la définition d'une interface Map<K, V> pour les tables associatives, ainsi que les mises en œuvre suivantes : TreeMap<K, V> qui utilise des arbres binaires de recherche auto-équilibrants (arbres rouge-noir), HashMap<K, V> qui utilise la technique du hachage, quelques autres que nous n'examinerons pas ici. Les ensembles et les tables associatives sont tellement similaires que les ensembles de l'api Java sont généralement mis en œuvre au moyen des tables associatives : HashSet<E> utilise en interne une table de type HashMap<E, Object> et associe à chaque élément présent dans l'ensemble un objet sans signification propre. TreeSet<E> utilise en interne une table de type TreeMap<E, Object>. 33 34 Itération Question : pourquoi ni notre interface Map ni celle de Java n'étendent l'interface Iterable? Réponse : parce qu'il n'est pas évident de savoir si on désire parcourir les clefs, les valeurs ou les entrées. En d'autres termes, on ne sait pas forcément choisir entre les trois options suivantes : Map<K, V> extends Iterable<K> Map<K, V> extends Iterable<V> Map<K, V> extends Iterable<Entry<K,V>> (même si la dernière option est clairement la plus générale et serait la plus logique si on devait faire un choix). entryset, keyset, values Plutôt que d'étendre directement l'interface Iterable, l'interface Map de Java offre des méthodes pour obtenir des vues sur l'ensemble des entrées, des valeurs ou la collection des clefs : interface Map<K, V> { Set<Map.Entry<K, V>> entryset(); Set<K> keyset(); Collection<V> values(); Ces vues permettent d'une part de parcourir les éléments de la table, mais aussi de les modifier. 35 36

Parcours via les vues Au moyen de la vue fournie par la méthode entryset il est facile d'afficher le contenu de notre annuaire téléphonique : Map<String, PN> pbook = ; pbook.put("jean", new PN("078 123 45 69")); pbook.put("marie",new PN("079 157 78 89")); for (Map.Entry<String, PN> e: pbook.entryset()) { System.out.println("Le numéro de "+ e.getkey() +" est "+ e.getvalue()); Modification via les vues Les trois vues fournies par les tables associatives Java offrent la possibilité de supprimer des éléments dans la table elle-même, via les méthodes des vues ou de leurs itérateurs. Par exemple, pour supprimer toutes les personnes dont le nom commence par J de notre annuaire, on peut écrire : Iterator<String> it = pbook.keyset().iterator(); while (it.hasnext()) { String n = it.next(); if (n.startswith("j")) { it.remove(); 37 38 Eléments/clefs modifiables Clefs modifiables Stocker dans un ensemble des éléments modifiables dont les méthodes hashcode, equals et/ou compareto dépendent de l'état est une très très mauvaise idée... Pour la même raison, utiliser de tels éléments comme clefs de tables associatives doit être évité à tout prix. 39 40

Points modifiables Eléments modifiables Pour illustrer le problème, utilisons une classe de points modifiables (une très mauvaise idée en soi!): class MutablePoint { public double x, y; public boolean equals(object that) { return (that instanceof MutablePoint) && (this.x == ((MutablePoint)that).x) && (this.y == ((MutablePoint)that).y); public int hashcode() { return (int)x * 3 + (int)y; Question : qu'affiche le programme ci-dessous et pourquoi? Set<MutablePoint> s = new HashSet<>(); MutablePoint p = new MutablePoint(0, 0); s.add(p); System.out.println(s.contains(p)); p.x = 0.1; System.out.println(s.contains(p)); p.x = 1; System.out.println(s.contains(p)); p.x = 0; System.out.println(s.contains(p)); 41 42 Eléments/clefs modifiables Résumé Règle : ne jamais stocker dans un ensemble (ou utiliser comme clef de table associative) des objets dont la valeur de hachage (méthode hashcode) ou la notion d'égalité (méthodes equals ou compareto) dépend de données modifiables. A vrai dire, de tels objets sont mal conçus au départ : ni la valeur de hachage ni la notion d'égalité ne devraient dépendre de l'état des objets. Malheureusement, les exemple de tels objets sont nombreux, à commencer par les instances de HashMap, HashSet, TreeMap et TreeSet de Java eux-même! Une table associative est une collection associant une valeur à une clef. Une table associative peut être mise en œuvre au moyen des mêmes techniques qu'un ensemble, à savoir une liste (associative), un tableau trié, un arbre binaire de recherche ou une table de hachage. 43 44