ntro.ca

        • Contrats de classe
        • Liens utiles
        • Calendrier
        • Calendrier groupe 2
        • Calendrier groupes 1, 3
        • Structure du cours
        • Évaluations
        • Matériel à se procurer
        • Les profs
          • Marc-Olivier Tremblay
          • Mathieu Bergeron
        • Module 1.1: installation + trier des cartes
        • Module 1.2: rappels POO
        • Module 1.3: tableau d'objets
        • Examen 1
        • Module 2.1: données JSON
        • Module 2.2: données en Java
        • Module 2.3: récursivité
        • Examen 2
        • Module 3.1: structure générique
        • Module 3.2: efficacité (1)
        • Module 3.3: efficacité (2)
        • Examen 3
        • Module 4.1: liste naïve
        • Module 4.2: liste par tableau
        • Module 4.3: liste chaînée
        • Examen 4
        • Module 5.1: mappage naïf
        • Module 5.2: mappage par hachage
        • Module 5.3: mappage par arbre
        • Examen 5
        • Équipes
          • Horaire groupe 1
          • Horaire groupe 2
          • Horaire groupe 3
          • Groupe 1
          • Groupe 2
          • Groupe 3
        • Projets vedettes 2022
        • Projets vedettes 2023
        • Projets vedettes 2024
        • Survol
        • Structure
        • Calendrier
        • Calendrier des séances
        • Évaluations
        • Exemples de jeu
        • Exemples de pages
        • Réponses à vos questions
        • Module 1: créer le projet
        • Module 2: concevoir l'application
        • Module 3: vues NtroFx
        • Module 4: modèle et navigation
        • Module 5: ajouter le dorsal, modifier le modèle
        • Module 7: améliorer l'affichage
        • Module 8: jeu en 2d
        • Module 9: client/serveur
        • Module 10: plusieurs instances du même modèle
        • TP1
        • Examen 1
        • TP2
        • Examen 2
        • Projet de fin de session
      • Ajout Format JSON
        • Calendrier
        • Évaluations
        • Structure du cours
        • Contrat de classe
        • Le prof
        • 01: Windows et Word
          • Astuces et raccourcis
        • 02: Word
        • 03: Word
          • Exercice Word: insertion d'éléments spéciaux
          • Exercice Word: tableaux
        • 04: Word
          • Exercice Word: références
          • TP01: Word (15%)
        • 05: PowerPoint
          • TP02: PowerPoint (10%)
        • 06: Examen Word (20%)
        • 07: Excel
        • 08: Excel
        • 09: Excel
          • TP03: Excel (15%)
        • 10: Excel
        • 11: Examen Excel (20%)
        • 12: Access
        • 13: Access
        • 14: Access
        • 15: Examen Access
      • Sondage H2023 (dept. info)
      • Vision H2023 (dept. info)
      • P1) exercices interactifs de lecture
      • P2) transition Excel vers Python
        • Atelier 2: un exemple
      • Index
      • Point de vue sur l'IA
    Theorie
    • Théorie 5.1: Map naïf
      • Interface d’un map
      • Implantation naïve d’un map
      • Problème d’efficacité

    Théorie 5.1: Map naïf #

    • Un map permet d’associer une clé à une valeur

      • chaque clé est unique
    • Par exemple, le map ci-bas associe la clé "xdf" à la valeur 12:

      • {"sdx":5,"xdf":12,"lkm":54}
    • Un map est aussi appelé: dictionnaire, liste associative, objet JSON

    • On peut voir un map comme un tableau où les indices ne sont pas des entiers:

    // Java valide
    Character[] tableauChar = new String[3];
    
    tableauChar[0] = 'a';        // l'indice est un entier
    tableauChar[1] = 'b';
    tableauChar[2] = 'c';
    
    //  0   1   2
    // ['a','b','c']         
    
    
    // Ce qu'on aimerais avoir (pas du Java valide)
    <String, Character>[] mapChar; 
    mapChar = new <String, Character>[3]; 
    
    mapChar["premier"]   = 'a';  // l'indice est une chaîne!
    mapChar["deuxième"]  = 'b';
    mapChar["troisième"] = 'c';
    
    //   "premier" "deuxième" "troisième"
    // [ 'a',      'b',       'c']         
    

    Interface d’un map #

    public interface MapJava<C extends Cle<?>, V extends Object> {
    	
    	void       put(C c, V v);      // associe la valeur v à la clé c
    	V          get(C c);           // obtenir la valeur associée à la clé c
    	void       clear();            // vide le map
    	int        size();             // taille du map
    	boolean    isEmpty();          // si vide
    	boolean    containsKey(C c);   // si le map contient la clé c
    	boolean    containsValue(V v); // si le map contient la valeur v
    	void       remove(C c);        // effacer la clé c (et la valeur associée)
    	List<C>    keys();             // retourner une liste de clés
    
    }
    

    Implantation naïve d’un map #

    • On utilise deux listes:

      • la liste des clés
      • la liste des valeurs
    • Une paire clé/valeur est mémorisée au même indice

    • Par exemple:

    // Le map
    {"sdx":5,"xdf":12,"lkm":54}
    
    // Les clés
    //         0     1     2
    cles =    ["sdx","xdf","lkm"]
    
    // Les valeurs
    //         0     1     2
    valeurs = [5,    12,   54]
    
    • Si la clé "xdf" est à l’indice 1 dans cles

    • Alors la valeur associée à "xdf" est aussi à l’indice 1, mais dans valeurs

    • En général:

    public class MapJavaNaif <C extends Cle<?>, V extends Object> extends MapJava<C,V> {
    	
    	private List<C> cles = new ArrayList<>();
    	private List<V> valeurs = new ArrayList<>();
    
    	@Override
    	public void put(C c, V v) {
    		int indiceCle = cles.indexOf(c);
    		
    		if(indiceCle != -1) {
    			valeurs.set(indiceCle, v);
    		}else {
    			cles.add(c);
    			valeurs.add(v);
    		}
    	}
    
    	@Override
    	public V get(C c) {
    		V valeur = null;
    		
    		int indiceCle = cles.indexOf(c);
    		
    		if(indiceCle != -1) {
    			valeur = valeurs.get(indiceCle);
    		}
    
    		return valeur;
    	}
    
    	@Override
    	public void remove(C c) {
    		int indiceCle = cles.indexOf(c);
    		
    		if(indiceCle != -1) {
    			cles.remove(indiceCle);
    			valeurs.remove(indiceCle);
    		}
    	}
    
    	@Override
    	public List<C> keys() {
    		return cles;
    	}
    }
    
    • Chaque clé doit héritée de la classe Cle:
    public class Cle<T extends Object> {
    
    	private T valeur;
    	
    	public Cle(T valeur) {
    		this.valeur = valeur;
    	}
    	
    	public T valeur() {
    		return valeur;
    	}
    }
    
    • on veut ainsi rendre explicite la notion de clé

    Problème d’efficacité #

    • Modifier une valeur dans notre map naïf n’est pas efficace:
    • Le problème est que indexOf fait une boucle sur la liste des clés

    • Mais on aimerait que ça soit efficace:

      • on veut utiliser le map comme un tableau
    Creative Commons License Creative Commons Attribution Creative Commons ShareAlike
    • Théorie 5.1: Map naïf
      • Interface d’un map
      • Implantation naïve d’un map
      • Problème d’efficacité