[Tuto] Les Maps

Informations pour bien débuter en PureBasic
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

[Tuto] Les Maps

Message par falsam »

Prérequis : Connaitre les structures.

Qu'est ce qu'une Map.
Une Map se caractérise par une structure pour stocker dynamiquement une collection d'éléments.

Chaque élément d'une Map est constituée d'une clé et de une ou plusieurs valeurs.
L'ordre d'insertion des éléments n'est pas conservé (contrairement à une liste chaînée).
Un élément d'une Map peut être consulté, modifié ou supprimé directement à l'aide de sa clé.
Une Map ne peut pas être triée.

A titre d'exemple nous allons créer une mini base téléphonique (Nom + Téléphone)

Création d'une Map.
Avant de travailler avec une Map, il faut préalablement déclarer sa structure et bien sur la Map.

Création de la structure de notre exemple :

Code : Tout sélectionner

Structure User
  User.s
  Phone.s
EndStructure
La création de la Map se fait avec le mot-clef NewMap: Nous allons créer la Map Users associé à la structure User.

Code : Tout sélectionner

NewMap Users.User()
Ajouter un élément.
AddMapElement(Map(), Cle) Ajoute un nouvel élément vide dans la Map() avec la Cle spécifiée.

Nous allons insérer l'utilisateur Larache ainsi que son téléphone 01.45.25.15.06

Code : Tout sélectionner

AddMapElement(Users(), "Larache")
Users()\User = "Larache"
Users()\Phone = "01.45.25.15.06"
Ajoutons trois autres utilisateurs:

Code : Tout sélectionner

AddMapElement(Users(), "Tricard")
Users()\User  ="Tricard"
Users()\Phone = "04.39.69.25.10"

AddMapElement(Users(), "Olap")
Users()\User  = "Olap"
Users()\Phone = "02.63.24.54.13"

AddMapElement(Users(), "Agile")
Users()\User  = "Agile"
Users()\Phone = "06.31.22.92.92"
Vous pouvez ajouter une boucle pour visualiser vos données contenu dans la Map.

Code : Tout sélectionner

ForEach Users()
  Debug Users()\User + " - " + Users()\Phone
Next
Accéder et visualiser un élément d'une Map.
Contrairement à une Liste chaînée, il est possible d'accéder directement à un élément d'une Map.

Nous allons afficher le numéro de téléphone de l'utilisateur Olap.

Rappeler vous : Chaque élément d'une Map est associé à une clé unique.

Vous pouvez rechercher ce numéro de téléphone de deux manières:

Code : Tout sélectionner

Debug Users("Olap")\Phone
ou alors comme ceci avec la fonction FindMapElement()

Code : Tout sélectionner

FindMapElement(Users(), "Olap")
Debug Users()\Phone
Mettre à jour un élément d'une Map.
C'est très simple, il suffit d'ajouter à nouveau cet élément. Par exemple changer le téléphone de l'utilisateur Larache.

Code : Tout sélectionner

AddMapElement(Users(), "Larache")
Users()\User  = "Larache"
Users()\Phone = "01.45.25.15.15"
Supprimer un élément d'une Map.
DeleteMapElement(Map() [, Cle]) permet d'accéder et effacer un élément d'une Map. Nous allons supprimer l'utilisateur Larache.

Code : Tout sélectionner

DeleteMapElement(Users(), "Larache")
Comme vous pouvez le voir, contrairement aux listes chaînées, il est inutile de parcourir une Map pour accéder à un élément et le supprimer.

Si vous souhaitez supprimer un lot d'éléments répondant à un ou plusieurs critères conditionnels, alors dans ce cas vous passerez par une boucle ForEach .... next. Si l'élément en cours de lecture répond à vos critères, vous pouvez le supprimer avec la fonction DeleteMapElement() sans préciser la clé.

N'hésitez pas consulter l'aide sur les fonctionnalités liées aux Maps.

Code de synthése

Code : Tout sélectionner

;Déclaration de la structure d'un utilisateur
Structure User
  User.s
  Phone.s
EndStructure

;Déclaration de la Map
NewMap Users.User()

;Ajout de 4 utilisateurs
AddMapElement(Users(), "Larache")
Users()\User  = "Larache"
Users()\Phone = "01.45.25.15.06"

AddMapElement(Users(), "Tricard")
Users()\User  ="Tricard"
Users()\Phone = "04.39.69.25.10"

AddMapElement(Users(), "Olap")
Users()\User  = "Olap"
Users()\Phone = "02.63.24.54.13"

AddMapElement(Users(), "Agile")
Users()\User  = "Agile"
Users()\Phone = "06.31.22.92.92"

;Modification d'un numéro de téléphone de "larache"
AddMapElement(Users(), "Larache")
Users()\User  = "Larache"
Users()\Phone = "01.45.25.15.15"

;Liste des utilisateurs.
Debug "# Liste des utlisateurs:"
ForEach Users()
  Debug Users()\User + " - " + Users()\Phone
Next

;Suppression de l'utilisateur "Larache"
DeleteMapElement(Users(), "Larache")

;Liste de controle aprés suppression de "Larache"
Debug #CRLF$ + "# Liste des utlisateurs aprés suppression de Larache:"
ForEach Users()
  Debug Users()\User + " - " + Users()\Phone
Next

;Chercher l'utilisateur "Olap"
FindMapElement(Users(), "Olap")
Debug #CRLF$ + "# Téléphone de l'utilisateur 'Olap' : " + Users()\Phone
Dernière modification par falsam le mar. 15/avr./2014 15:50, modifié 1 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
majikeyric
Messages : 602
Inscription : dim. 08/déc./2013 23:19
Contact :

Re: [Tuto] Les Maps

Message par majikeyric »

Mince?!! Y a mon numéro de tél dans l'exemple !!! 8O


je déconne :mrgreen:

Merci pour ce tuto :)

La modification d'un élément peut aussi être faite par une recherche et une mise à jour apparemment.

Code : Tout sélectionner

FindMapElement(Users(), "Larache")
Users()\User  = "Larache"
Users()\Phone = "01.45.25.15.15"
Mais c'est sur qu'autant ajouter dans tous les cas (si présence ou pas déjà de l'élément).
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: [Tuto] Les Maps

Message par graph100 »

J'ajouterais qu'il serai bon de prendre l'habitude de passer par les pointeurs pour manipuler les éléments des MAP !
Ceci pour être sur de modifier le bon élément, et assurer une bonne compatibilité lors de l'ajout de thread.

Code : Tout sélectionner

;Déclaration de la structure d'un utilisateur
Structure User
		User.s
		Phone.s
EndStructure

;Déclaration de la Map
NewMap Users.User()

;Ajout de 4 utilisateurs
*pointeur.user = AddMapElement(Users(), "Larache")
*pointeur\User  = "Larache"
*pointeur\Phone = "01.45.25.15.06"


;Chercher l'utilisateur "Olap"
*pointeur.user = FindMapElement(Users(), "Larache")
If *pointeur
  Debug #CRLF$ + "# Téléphone de l'utilisateur '" + *pointeur\User + "' : " + *pointeur\Phone
Else
  Debug #CRLF$ + "# Utilisateur introuvable"
EndIf
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Répondre