Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Utilisation d'une hashtable java avec une clé partielle

13 views
Skip to first unread message

isabe

unread,
Oct 29, 2009, 7:30:30 AM10/29/09
to
Bonjour,
Je souhaite �tablir une correspondance entre le d�but d

Patrick

unread,
Oct 29, 2009, 7:33:50 AM10/29/09
to
Le 29/10/2009 13:30, isabe a �crit :

> Bonjour,
> Je souhaite �tablir une correspondance entre le d�but d

Bonjour,
C'est facile, il suffit de f

Cenekemoi

unread,
Oct 29, 2009, 9:03:49 AM10/29/09
to
"Patrick" <peuim...@quelquepart.fr> a �crit dans le message de
news:4ae97d9e$0$9955$426a...@news.free.fr...


:-))))

--
Cordialement, Thierry ;-)

isabe

unread,
Oct 29, 2009, 12:04:11 PM10/29/09
to
Cenekemoi a �crit le 29/10/2009 � 14h03 :
> "Patrick" a �crit dans le
> message de
> news:4ae97d9e$0$9955$

>> Le 29/10/2009 13:30, isabe a �crit :
>>> Bonjour,
>>> Je souhaite �tablir une correspondance entre le d�but d
>>>
>>
>> Bonjour,
>> C'est facile, il suffit de f
>>
>
>
> :-))))
>
> --
> Cordialement, Thierry ;-)
Il suffit de f... quoi?

Yliur

unread,
Oct 29, 2009, 12:44:20 PM10/29/09
to
Le Thu, 29 Oct 2009 11:04:11 -0500
isabe <is...@domain-xyz.in> a écrit :

> Cenekemoi a écrit le 29/10/2009 à 14h03 :
> > "Patrick" a écrit dans le
> > message de
> > news:4ae97d9e$0$9955$
> >> Le 29/10/2009 13:30, isabe a écrit :
> >>> Bonjour,
> >>> Je souhaite établir une correspondance entre le début d


> >>>
> >>
> >> Bonjour,
> >> C'est facile, il suffit de f
> >>
> >
> >
> > :-))))
> >
> > --
> > Cordialement, Thierry ;-)
> Il suffit de f... quoi?


Le message d'origine était tronqué ;)

> >>> Bonjour,
> >>> Je souhaite établir une correspondance entre le début d

Ca ne suffit pas à fournir une meilleure réponse que

> >> C'est facile, il suffit de f

:)

Quel est votre problème exactement ?

isabe

unread,
Oct 29, 2009, 1:46:00 PM10/29/09
to
Yliur a �crit le 29/10/2009 � 17h44 :

> Le Thu, 29 Oct 2009 11:04:11 -0500
> isabe a �crit :

>
>> Cenekemoi a �crit le 29/10/2009 � 14h03 :
>> > "Patrick" a �crit dans le
>> > message de
>> > news:4ae97d9e$0$9955$

>> >> Le 29/10/2009 13:30, isabe a �crit :
>> >>> Bonjour,
>> >>> Je souhaite �tablir une correspondance entre le
>> d�but d

>> >>>
>> >>
>> >> Bonjour,
>> >> C'est facile, il suffit de f
>> >>
>> >
>> >
>> > :-))))
>> >
>> > --
>> > Cordialement, Thierry ;-)
>> Il suffit de f... quoi?
>>
>
>
> Le message d'origine �tait tronqu� ;)

>
>> >>> Bonjour,
>> >>> Je souhaite �tablir une correspondance entre le
>> d�but d
>>
>
> Ca ne suffit pas � fournir une meilleure r�ponse que

>
>> >> C'est facile, il suffit de f
>>
>
> :)
>
> Quel est votre probl�me exactement ?
Je souhaite �tablir une correspondance entre le d�but d'une chaine est une
autre chaine.
Exemple :
Si la chaine commence par � 12345 � elle fait partie du GROUPE1, si elle
commence par � 542 � elle fait partir du GROUPE2 ...
J'ai cr�� une hashtable avec comme cl� 12345*, 245*,542*, ... et les valeurs de
GROUPE correspondantes.
Par contre je ne sais pas comment faire quand je re�ois ma String sur 16
caract�res pour trouver son groupe d'appartenance ?
Merci de votre aide

Yliur

unread,
Oct 29, 2009, 4:21:10 PM10/29/09
to
Le Thu, 29 Oct 2009 12:46:00 -0500
isabe <is...@domain-xyz.in> a écrit :

> Yliur a écrit le 29/10/2009 à 17h44 :
> > Le Thu, 29 Oct 2009 11:04:11 -0500

> > isabe a écrit :


> >
> >> Cenekemoi a écrit le 29/10/2009 à 14h03 :

> >> > "Patrick" a écrit dans le
> >> > message de
> >> > news:4ae97d9e$0$9955$


> >> >> Le 29/10/2009 13:30, isabe a écrit :
> >> >>> Bonjour,
> >> >>> Je souhaite établir une correspondance entre le

> >> début d


> >> >>>
> >> >>
> >> >> Bonjour,
> >> >> C'est facile, il suffit de f
> >> >>
> >> >
> >> >
> >> > :-))))
> >> >
> >> > --
> >> > Cordialement, Thierry ;-)
> >> Il suffit de f... quoi?
> >>
> >
> >

> > Le message d'origine était tronqué ;)
> >
> >> >>> Bonjour,
> >> >>> Je souhaite établir une correspondance entre le
> >> début d
> >>
> >

> > Ca ne suffit pas à fournir une meilleure réponse que


> >
> >> >> C'est facile, il suffit de f
> >>
> >
> > :)
> >

> > Quel est votre problème exactement ?
> Je souhaite établir une correspondance entre le début d'une chaine


> est une autre chaine.
> Exemple :

> Si la chaine commence par « 12345 » elle fait partie du GROUPE1, si
> elle commence par « 542 » elle fait partir du GROUPE2 ...
> J'ai créé une hashtable avec comme clé 12345*, 245*,542*, ... et les
> valeurs de GROUPE correspondantes.
> Par contre je ne sais pas comment faire quand je reçois ma String sur
> 16 caractères pour trouver son groupe d'appartenance ?
> Merci de votre aide

Je ne suis pas sûr de comprendre.
Vous voulez faire l'association chaîne complète -> nom du groupe
(GROUPE1, GROUPE2, ...), c'est ça ?

Je suppose que vous ne voulez pas lister les débuts de chaîne dans le
code mais les retrouver dans la table de hachage. Dans ce cas vous
pouvez la parcourir, par exemple avec quelque chose comme ça (de
mémoire) :
String laChaineATester = "12349090786" ;
for (Entry<String,Groupe> entree : tableHachage.entrySet())
{
if (laChaineATester.startsWith (entree.getKey()))
System.out.println ("Groupe : " + entree.getValue()) ;
}
(note : pour ça il ne faut pas mettre les étoiles dans les clés)

Ca permet de faire les associations, mais ce n'est pas très efficace
évidemment.

Ah tiens, TreeMap semble faire ce que vous cherchez : en utilisant
ceilingEntry() vous devriez y arriver : ceilingEntry renvoie l'entrée
dans la table d'association correspondant à la clé la plus proche de
celle fournie en paramètre (clé inférieure ou égale à la clé fournie
en paramètre).
Donc en appelant tableHachage.ceilingEntry (laChaineATester) on
récupère la valeur dont la clé est la plus proche de la chaîne à
tester, sans la dépasser (les comparaisons sur les chaînes se font
sur l'ordre alphabétique). Il faut ensuite vérifier que la clé
renvoyée est bien un préfixe de la chaîne (le nom complet de la
classe Entry est Map.Entry) :
Entry<String,Groupe> entree = tableHachage.ceilingEntry
(laChaineATester) ;
if (laChaineATester.startsWith (entree.getKey()))
System.out.println ("Groupe : " + entree.getValue()) ;
else
System.out.println ("Groupe non trouvé") ;
(note : il ne faut toujours pas mettre les étoiles dans les clés pour
que ça marche)

Bien sûr je parle toujours de table de hachage alors qu'il s'agit d'un
arbre, c'est un peu abusif, mais c'était pour suivre votre question.
Et la classe TreeMap implémente bien sûr Map, comme HashMap.

Est-ce que ça vous convient ?

isabe

unread,
Oct 30, 2009, 3:20:15 AM10/30/09
to
Yliur a �crit le 29/10/2009 � 21h21 :

> Le Thu, 29 Oct 2009 12:46:00 -0500
> isabe a �crit :
>
>> Yliur a �crit le 29/10/2009 � 17h44 :

>> > Le Thu, 29 Oct 2009 11:04:11 -0500
>> > isabe a �crit :
>> >
>> >> Cenekemoi a �crit le 29/10/2009 � 14h03 :
>> >> > "Patrick" a �crit dans le
>> >> > message de
>> >> > news:4ae97d9e$0$9955$

>> >> >> Le 29/10/2009 13:30, isabe a �crit :
>> >> >>> Bonjour,
>> >> >>> Je souhaite �tablir une correspondance entre le
>> >> d�but d

>> >> >>>
>> >> >>
>> >> >> Bonjour,
>> >> >> C'est facile, il suffit de f
>> >> >>
>> >> >
>> >> >
>> >> > :-))))
>> >> >
>> >> > --
>> >> > Cordialement, Thierry ;-)
>> >> Il suffit de f... quoi?
>> >>
>> >
>> >
>> > Le message d'origine �tait tronqu� ;)
>> >
>> >> >>> Bonjour,
>> >> >>> Je souhaite �tablir une correspondance entre le
>> >> d�but d
>> >>
>> >
>> > Ca ne suffit pas � fournir une meilleure r�ponse que

>> >
>> >> >> C'est facile, il suffit de f
>> >>
>> >
>> > :)
>> >
>> > Quel est votre probl�me exactement ?
>> Je souhaite �tablir une correspondance entre le d�but d'une

>> chaine
>> est une autre chaine.
>> Exemple :
>> Si la chaine commence par � 12345 � elle fait partie du GROUPE1,
>> si
>> elle commence par � 542 � elle fait partir du GROUPE2 ...
>> J'ai cr�� une hashtable avec comme cl� 12345*, 245*,542*,

>> ... et les
>> valeurs de GROUPE correspondantes.
>> Par contre je ne sais pas comment faire quand je re�ois ma String sur
>> 16 caract�res pour trouver son groupe d'appartenance ?
>> Merci de votre aide
>>
>
> Je ne suis pas s�r de comprendre.
> Vous voulez faire l'association cha�ne compl�te -> nom du
> groupe
> (GROUPE1, GROUPE2, ...), c'est �a ?
>
> Je suppose que vous ne voulez pas lister les d�buts de cha�ne dans

> le
> code mais les retrouver dans la table de hachage. Dans ce cas vous
> pouvez la parcourir, par exemple avec quelque chose comme �a (de
> m�moire) :

> String laChaineATester = "12349090786" ;
> for (Entry<String,Groupe> entree : tableHachage.entrySet())
> {
> if (laChaineATester.startsWith (entree.getKey()))
> System.out.println ("Groupe : " + entree.getValue()) ;
> }
> (note : pour �a il ne faut pas mettre les �toiles dans les
> cl�s)
>
> Ca permet de faire les associations, mais ce n'est pas tr�s efficace
> �videmment.

>
> Ah tiens, TreeMap semble faire ce que vous cherchez : en utilisant
> ceilingEntry() vous devriez y arriver : ceilingEntry renvoie l'entr�e
> dans la table d'association correspondant � la cl� la plus proche
> de
> celle fournie en param�tre (cl� inf�rieure ou �gale
> � la cl� fournie
> en param�tre).

> Donc en appelant tableHachage.ceilingEntry (laChaineATester) on
> r�cup�re la valeur dont la cl� est la plus proche de la
> cha�ne �
> tester, sans la d�passer (les comparaisons sur les cha�nes se font
> sur l'ordre alphab�tique). Il faut ensuite v�rifier que la
> cl�
> renvoy�e est bien un pr�fixe de la cha�ne (le nom complet

> de la
> classe Entry est Map.Entry) :
> Entry<String,Groupe> entree = tableHachage.ceilingEntry
> (laChaineATester) ;
> if (laChaineATester.startsWith (entree.getKey()))
> System.out.println ("Groupe : " + entree.getValue()) ;
> else
> System.out.println ("Groupe non trouv�") ;
> (note : il ne faut toujours pas mettre les �toiles dans les cl�s
> pour
> que �a marche)
>
> Bien s�r je parle toujours de table de hachage alors qu'il s'agit d'un
> arbre, c'est un peu abusif, mais c'�tait pour suivre votre question.
> Et la classe TreeMap impl�mente bien s�r Map, comme HashMap.
>
> Est-ce que �a vous convient ?
Bonne id�e, merci beaucoup.
Par contre le fait d�utiliser TreeMap plut�t que HashMap ne risque-t-il pas
d��tre p�nalisant au niveau performance ?

Yliur

unread,
Oct 30, 2009, 11:03:33 AM10/30/09
to
> Par contre le fait d�utiliser TreeMap plut�t que HashMap ne
> risque-t-il pas d��tre p�nalisant au niveau performance ?

Ca d�pend de ce que vous en faites.
Malheureusement je ne me souviens plus tr�s bien des cas o� les arbres
sont plus (ou moins) efficaces que les tables de hachage :( .
Pour la consultation je crois qu'ils sont en principe un peu plus lent,
mais il n'y a pas de probl�me de code de hachage (pas besoin de code
de hachage en th�orie [mais la sp�cification de Map indique que
n'importe quelle impl�mentation peut se servir du code de hachage] et
pas de risque d'avoir de nombreuses cl�s ayant le m�me code de
hachage si la fonction de hachage est mal choisie).
Par contre pour l'insertion je crois que c'est plus souple parce qu'ils
peuvent cro�tre r�guli�rement, alors qu'une table de hachage doit
�tre dimensionn�e correctement au d�but ou r�organis�e au fur et �
mesure qu'elle cro�t pour ne pas �tre trop remplie (si elle est
pleine, elle perd tout son int�r�t).
Ce sont souvent des arbres qui sont utilis�s pour les index des bases
de donn�es, ce n'est quand m�me pas si lent :) .

Valdo TSCHANTRÉ

unread,
Dec 2, 2009, 11:54:07 AM12/2/09
to
Yliur a �crit :

> Ah tiens, TreeMap semble faire ce que vous cherchez : en utilisant
> ceilingEntry() vous devriez y arriver : ceilingEntry renvoie l'entr�e
> dans la table d'association correspondant � la cl� la plus proche de
> celle fournie en param�tre (cl� inf�rieure ou �gale � la cl� fournie
> en param�tre).

Attention, il faut utiliser floorEntry et non ceilingEntry.

Valdo.

Yliur

unread,
Dec 9, 2009, 5:21:34 PM12/9/09
to
Le Wed, 02 Dec 2009 17:54:07 +0100
Valdo TSCHANTRÉ <PRENO...@GMAIL-NOSPAM.COM> a écrit :

> Yliur a écrit :


> > Ah tiens, TreeMap semble faire ce que vous cherchez : en utilisant
> > ceilingEntry() vous devriez y arriver : ceilingEntry renvoie

> > l'entrée dans la table d'association correspondant à la clé la plus
> > proche de celle fournie en paramètre (clé inférieure ou égale à la
> > clé fournie en paramètre).
>

> Attention, il faut utiliser floorEntry et non ceilingEntry.
>
> Valdo.

Ah ouais, zut... j'ai été un peu vite

steph

unread,
Jan 5, 2010, 6:11:37 PM1/5/10
to

La solution avec les sorted map est plut�t �l�gante car elle utilise
l'API de la JDK.
Par contre, elle cache un algo un peu plus simple IMHO: la recherche
dychotomique.
Je ne sais pas combien il existe de groupes mais les cl�s sont connues
d'avance.
Donc le but est conna�tre le num�ro de groupe dans lequel tu dois
"ranger" ta valeur.
Je propose donc d'utiliser l'impl�mentation de la recherche dychotomique
qui est fa�te dans java.util.Collections au travers de la m�thode
binarySerach(liste, key) pour rechercher ce num�ro puis d'ins�rer la
valeur dans le groupe correspondant.


Je ferais qqch du genre:
<code>
final int p = ...;
List<String> keys = new ArrayList<String>(p);
keys.add(key1);
...
keys.add(keyp);
List<String>[] groups = (List<String>[])
Array.newInstance(LinkedList.class, p);
for (int i = 0; i < groups.length; i++)
{
// je choisi linkedlist car les insertions sont moins co�teuses � priori
groups[i] = new LinkedList<String>();
}
for (String value : sample)
{
int binarySearch= Collections.binarySearch(keys, value);
int key= binarySearch >= 0 ? binarySearch : (-binarySearch-1-1);
groups[key].add(value);
}
</code>

Est-ce que cela r�pond � ton besoin ?

0 new messages