[Basic] Utilisation du service EnumerableMap

Vos meilleures macros et portions de code sont publiées dans cette section.
Aucun support sur une question de programmation ici !

Modérateur : Vilains modOOs

Règles du forum
Aucune question dans cette section !
Celle-ci rassemble les meilleures macros et portions de code. Vous pouvez en revanche commenter ou argumenter le code exposé. Vous pouvez même remercier l'auteur (cela fait toujours plaisir) en indiquant par exemple dans quel cadre ou contexte vous en avez eu l'utilité.
Si vous avez à poster quelque chose, faites-le depuis la section Macros et API et demandez à un modérateur de l'y déplacer.
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
Messages : 2668
Inscription : 30 avr. 2009 04:54
Localisation : CATALUNYA

[Basic] Utilisation du service EnumerableMap

Message par Churay »

Hubert Lambert Inside :

Code : Tout sélectionner

em = com.sun.star.container.EnumerableMap.create("string","[]string")
em.put("A", array("Albert","Annie"))
em.put("B", array("Bernard", "Béatrice"))
em.put("C", array("Christophe", "Cécile"))
em.put("D", array("Dominique", "Didier"))
B = em.get("B")
for each nom in B
    print nom
next nom
Dernière modification par Churay le 30 nov. 2016 08:57, modifié 1 fois.
cOOordialement
---
AOO 4.0.1 W7-PRO & LO 5.1.6.2 Debian 7.8 & Ubuntu 16.04 LTS
---
F1 : ça aide...
XRay + SDK :super:
---
Quand le NOT CONFIRMED sera corrigé (OOo et LO) , je serai heureux...
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

Re: Utilisation du service EnumerableMap

Message par Hubert Lambert »

Pour l'instanciation en basic, la source est ici : https://forum.openoffice.org/en/forum/v ... 56#p385856.
:wink:
AOOo 4.1.7 sur Win10
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
Messages : 2668
Inscription : 30 avr. 2009 04:54
Localisation : CATALUNYA

Re: [Basic] Utilisation du service EnumerableMap

Message par Churay »

L'interface xMap permet de décrire une map (relation entre clés et valeurs).
L'interface XEnumerableMap étend XMap avec la possibilité d'énumération (XElementAccess)

Le service EnumerableMap fournit l'implémentation de l'interface. voir la doc de l'API pour les types de clés et de valeurs

Pour faire simple : cela permet de créer des ARRAY évolués : clé1, valeur1 ; clé2, valeur2 ; ...

La possibilité d'énumération permet de rechercher une valeur à partir de sa clé (.get) au lieu de balayer l'ARRAY à la recherche de la clé.

Dans le code d'Hubert Lambert,

Code : Tout sélectionner

    em = com.sun.star.container.EnumerableMap.create("string","[]string") 
Création du container.

Code : Tout sélectionner

    em.put("A", array("Albert","Annie"))
    em.put("B", array("Bernard", "Béatrice"))
    em.put("C", array("Christophe", "Cécile"))
    em.put("D", array("Dominique", "Didier"))
Création de chaque couple clé/valeur, la valeur associé est un ARRAY

Code : Tout sélectionner

    B = em.get("B")
Récupération de la valeur associée à la clé "B"

Code : Tout sélectionner

    for each nom in B
        print nom
    next nom
S'agissant d'un ARRAY, balayage des éléments de l'ARRAY.

L'approche de bm sur le forum anglophone permet de découvrir d'autres possibilités

Code : Tout sélectionner

		enu = .createKeyEnumeration(False)
		Do While enu.hasMoreElements
			elem = enu.nextElement
			MsgBox("Key : " & elem, 0, "createKeyEnumeration")
		Loop
permet d'accéder à la clé

Code : Tout sélectionner

		enu = .createValueEnumeration(False)
		Do While enu.hasMoreElements
			elem = enu.nextElement
			MsgBox("Value : " & elem, 0, "createValueEnumeration")
		Loop
permet d'accéder à la valeur

Code : Tout sélectionner

		enu = .createElementEnumeration(False)
		Do While enu.hasMoreElements
			elem = enu.nextElement
			MsgBox("Key : " & elem.First & _
				chr(10) & "Value : " & elem.Second, 0, "createElementEnumeration")
		Loop
permet d'accéder au couple clé (elem.First) / valeur (elem.Second)

Adapté au code de Hubert Lambert, cela pourrait donner

Code : Tout sélectionner

Sub Main
Dim enu AS Object, elem, aNom()

	em = com.sun.star.container.EnumerableMap.create("string","[]string")
	em.put("A", array("Albert","Annie"))
	em.put("B", array("Bernard", "Béatrice"))
	em.put("C", array("Christophe", "Cécile"))
	em.put("D", array("Dominique", "Didier"))

	enu = em.createElementEnumeration(False)
	Do While enu.hasMoreElements
		elem = enu.nextElement
		aNom = elem.Second
		MsgBox("Key : " & elem.First & chr(10) & "Value : " & aNom(0) & " - " & aNom(1), 0, "createElementEnumeration")
	Loop
End Sub
Sachant que dans l'exemple, l'ARRAY n'a que deux éléments, j'accède directement à aNom(0) et aNom(1). Un truc plus fiable serait de déterminer UBOUND.

Ici, il s'agit d'une approche simple, voire simpliste, mais qui permet d'entrevoir des possibilités intéressantes, entre autres au niveau performances.
cOOordialement
---
AOO 4.0.1 W7-PRO & LO 5.1.6.2 Debian 7.8 & Ubuntu 16.04 LTS
---
F1 : ça aide...
XRay + SDK :super:
---
Quand le NOT CONFIRMED sera corrigé (OOo et LO) , je serai heureux...