Page 1 sur 1

[Basic] Utilisation du service EnumerableMap

Publié : 29 nov. 2016 14:27
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

Re: Utilisation du service EnumerableMap

Publié : 29 nov. 2016 14:40
par Hubert Lambert
Pour l'instanciation en basic, la source est ici : https://forum.openoffice.org/en/forum/v ... 56#p385856.
:wink:

Re: [Basic] Utilisation du service EnumerableMap

Publié : 30 nov. 2016 15:28
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.