Le 16 May 2002 Olivier M a �crit :

> Salut � tous
> 
> J'ai une Map de paires d'objets.
> Chaque paire est constitu�e d'un objet unique (la
> cl�), et d'un objet theValue.
> Pour avoir la map tri�e selon la cl�, pas de probl�mes
> bien s�r.

D'apr�s ce que j'ai compris, une "Map" ne propose pas � elle seule un 
tri ; seule les mises en oeuvre peuvent �ventuellement en proposer 
un. Il faudrait donc que tu nous dises avec quelle Map exactement tu 
travailles.

Dans la suite, j'imagine que c'est une TreeMap.


> Mais je souhaiterai trier ma map selon l'objet
> theValue, sachant que theValue n'est pas unique.

Si tu tiens � garder la possibilit� de plusieurs theValue ayant les 
m�mes valeurs (selon "equals", je suppose), cela ne va pas �tre 
simple. Tu ne peux pas utiliser directement un Map dans lequel ta 
clef de rangement serait theValue, justement parce que tu vas contre 
le principe du Map : une clef, une valeur, en non pas deux valeurs.


> L'objet theValue �tant de type Integer ou String, et
> donc impl�mentant l'interface Comparable, �a doit bien
> pouvoir se faire.

A condition tout de m�me qu'il y ait soit des Integer, soit des 
String, sinon �a commence � �tre farfelu !

Je te propose de transformer ton TreeMap en un Set de Map.Entry, puis 
de le convertir en un tableau, tableau que tu ordonnes avec un 
Comparable perso.

Cela donne � peu pr�s (non test�) :

Set mapElemSet = leTreeMap.entrySet();

Map.Entry[] mapElemTab = mapElemSet.toArray(new 
Map.Entry[mapElemSet.size()]);

Arrays.sort(mapElemTab, new ComparatorPerso());

Ta table mapElemTab est maintenant class�e ; ton ComparatorPerso peut 
�tre :

class ComparatorPerso implements Comparator
{
        public void compare(Object o1, Object o2)
        {
                Map.Entry mapEntry1, mapEntry2;
                String s1, s2;

                mapEntry1 = (Map.Entry)o1;
                mapEntry2 = (Map.Entry)o2;
                s1 = (String)mapEntry1.getValue();
                s2 = (String)mapEntry2.getValue();
                return s1.compareTo(s2);
        }

        ... pour equals, c'est pareil que pour compare en rempla�ant 
compareTo par equals.
}

Il reste que c'est un peu louf, car le Comparator s'exerce non sur 
les objets pass�s en param�tres, mais sur une portion de ceux-ci. 
(c'est le "getValue" qui r�pond � ton probl�me te classer les entr�es 
selon leur valeur).

> 
> Dans le m�me ordre d'id�e, je souhaiterais pouvoir
> retrouver l'ordre dans lequel les paires d'objets ont
> �t� ajout�es dans la map.
> 

La seule solution que je vois pour �a est de te cr�er un Map � toi 
qui red�finisse toutes les m�thodes � la mode "addQuelquechose", et 
je ne suis m�me pas s�r que �a marche.

> Merci de vos conseils

Pourrais-tu nous donner ton probl�me de base, parce que je trouve que 
les solutions que je te sugg�re sont un peu tir�es par les cheveux, 
bien qu'elles r�pondent au probl�me tel que tu l'exprimes ? En fait, 
tu voudrais donner � un Map des fontions pour lesquels il n'est pas 
con�u, et c'est pour �a que l'on se retrouve dans des situations 
limites.

--
Sur le Web, tout de suite.
Herve AGNOUX - diaam informatique
http://www.diaam-informatique.com

Répondre à