Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
807 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

[Java] problème avec le switch

n°195257
MelloW
Posté le 14-08-2002 à 15:32:41  profilanswer
 

Reprise du message précédent :

_gtm_ a écrit a écrit :

 
 
Pour les nouvelles classes : voir le nouvel exemple de code
 
Sinon, c'est pas du double dispatching. Le double dispatching, c'est quand le choix de la fonction dépend de 2 paramètres (exemple typique : on veut chercher la fonction qui calcule l'intersection entre deux objets - cette fonction dépend du type des deux objets). Ici, la fonction ne dépend que du nom de fonction, donc c'est un simple dispatching.
 
Et ensuite pour l'histoire de la fonction injective : rien n'empêche de redéfinir la fonction de hachage.  
Par contre, ta proposition de valeur unique, soit c'est n'importe quoi, soit j'ai pas compris ce que tu proposes : On veut une valeur unique, mais dans un interval compatible avec switch. Donc mettre bout à bout des valeurs ascii, ça sert à rien du tout (et en plus ça fait vraiment rien, puisque la chaine c'est deja une suite de valeurs ascii).
 



C'est qu'on a pas la même définition de double dispatching -> http://www.chimu.com/publications/ [...] ching.html
Et pour la valeur unique je crois que t'as pas compris (mon explication était pas brillante...):
'b'   'l'   'a'   'b'  'l'  'a'
 ^     ^     ^     ^    ^    ^
 |     |     |     |    |    |
205   223   204   205  223  204
 
total (une addition avec des multiplication) = 205223204205223204 -> une valeur unique, mais par contre je sais si ca trouve dans l'intervalle du switch... je proposais cela pcq le switch accepte pas les strings apparement (en java) et que de cette facon tu obtiens un chiffre unique pour chaque string


---------------
Belgian Connection
mood
Publicité
Posté le 14-08-2002 à 15:32:41  profilanswer
 

n°195258
MelloW
Posté le 14-08-2002 à 15:33:09  profilanswer
 

MelloW a écrit a écrit :

C'est qu'on a pas la même définition de double dispatching -> http://www.chimu.com/publications/ [...] ching.html
Et pour la valeur unique je crois que t'as pas compris (mon explication était pas brillante...):

Code :
  1. 'b'   'l'   'a'   'b'  'l'  'a'
  2. ^     ^     ^     ^    ^    ^
  3. |     |     |     |    |    |
  4. 205   223   204   205  223  204


 
total (une addition avec des multiplication) = 205223204205223204 -> une valeur unique, mais par contre je sais si ca trouve dans l'intervalle du switch... je proposais cela pcq le switch accepte pas les strings apparement (en java) et que de cette facon tu obtiens un chiffre unique pour chaque string



:pt1cable: Ooops, désolé ;)


Message édité par MelloW le 14-08-2002 à 15:34:07

---------------
Belgian Connection
n°195278
MelloW
Posté le 14-08-2002 à 15:58:49  profilanswer
 

Au fait t'as raison, j viens de revoir ton code et c'est du simple dispatching :sweat:
Le double est utilisée dans des cas spéciaux... désolé :jap: Ca m'apprendra à pas bien lire le code et à répondre trop vite  :sweat:


---------------
Belgian Connection
n°195424
benou
Posté le 14-08-2002 à 19:50:01  profilanswer
 

> _gtm_ je n'avais pas compris ton truc de cette façon, et en effet, la méthode sera bien souvent plus efficace.

n°195428
benou
Posté le 14-08-2002 à 20:01:04  profilanswer
 

sinon, pour info, je relève certains truc dans ce que tu as dit :  
 

Citation :

Le calcul d'une valeur de hachage est équivalennt à la comparaison de chaines au niveau du temps d'execution.  


 
Ca ca dépend énormément des cas : par exemple si les deux chaines sont de taille différentes => c'est pas égal => on a résolu le equals en 1 test. Le hascode lui iterera sur toute la chaine.
 
Dans le cas des chaines de caractères, et sans parler de la mise en cache du calcul du hashcode, un equals est bien plus rapide qu'un hashCode !
 

Citation :


Il y aura ensuite peut-être des comparaisons de chaînes à faire (chaînes qui ont le même valeur de hachage), mais sur un ensemble beaucoup plus réduit que la liste initiale.


Dans une HashMap, c'est fait comme ca :  après avoir déterminé l'index (hashCode modulo taille du tableau), il va falloir parcourir une liste chainée. Sur chacun des élément de cette liste chainée, on va calculer le hashCode + faire un equals dans le cas ou le hashCode est identique.
 
Mais sinon, je suis bien d'accord : statistiquement, c'est plus efficace dans le cas où on doit tester l'égalité avec bcp de chaines.
 
Mais pour les cas habiuels, une suite de if sera bien meilleur en perf et en utilisation mémoire !

n°195507
_gtm_
Posté le 14-08-2002 à 22:56:53  profilanswer
 

benou : je ne suis pas sur que la HashMap soit implémentée comme ça. Ou alors qu'il y aurait une autre classe qui ferait mieux ce que je cherche.
 
Voilà comment je vois ma HashMap :  
Pour insérer un élément : on calcule une valeur de hachage. Ensuite, on applique une autre fonction surjective à cette valeur de hachage pour obtenir une classe d'équivalence. Par exemple ont peut réduire les valeurs hachées à l'intervalle [0.255]. On insère notre élément dans cette classe d'équivalence (qui peut être une liste chaînée).
 
Pour la recherche d'un élément : On calcule la valeur de hachage de l'élément recherché, et on en déduit la classe d'équivalence. Il faut ensuite faire des comparaisons avec les éléments de notre classe d'équivalence, mais on va en avoir 1/255ème du nombre d'éléments au total, et c'est là qu'on gagne beaucoup de temps.
 
Mais c'est vrai qu'avec peu d'éléments (genre une demi-douzaine), les ifs vont être plus efficaces. Mais tu auras du remarquer que je n'aime pas les ifs et les switch :)

n°195532
gfive
Posté le 15-08-2002 à 00:10:26  profilanswer
 

Bah, sinon, le coup de calculer des valeur uniques en types primitifs pour faire un switch en Java, je crois pas que ça marche : il me semble que le switch ne peut prendre que des constantes en argument de chaque case...
 
Mais sinon, pour apporter de l'eau au moulin de __gtm__, quand j'étais encore u jeune padawan de la programmation de protocole réseau pour un chat, j'avais fait avec un switch : une méthode me renvoyait un objet, par l'intermédiaire d'un gros switch tout moche sur les ID des messages reçus...
Maintenant, j'ai une jolie Hashtable, avec des Integer comme clés, et des objet Factory comme valeur...Ben j'ai gravement gagné en souplesse (parce que la correspondance clé->classe Factory est stockée dans un fichier, donc, si j'ajoute un message, hop, j'ai que la classe à écrire et le fichier à mettre à jour)  
 
Donc, le switch, ça pue du rond... :D


Message édité par gfive le 15-08-2002 à 00:17:32
n°195537
darklord
You're welcome
Posté le 15-08-2002 à 00:21:39  profilanswer
 

gfive a écrit a écrit :

 
Donc, le switch, ça pue du rond... :D




 
conclusion que je partage  [:titprem]


---------------
Just because you feel good does not make you right
n°195542
benou
Posté le 15-08-2002 à 00:36:18  profilanswer
 

_gtm_ a écrit a écrit :

benou : je ne suis pas sur que la HashMap soit implémentée comme ça. Ou alors qu'il y aurait une autre classe qui ferait mieux ce que je cherche.




j'ai étudié le code source de la HashMap donc je te certifie que ca fonctionne bien comme je te l'ai dit, ce qui reviens au même que ce que tu viens de détailler.
 
par défaut la taille d'une HashMap (ou la grandeur de l'interval de la classe d'équivalence si tu préfère) est 11.  
 
et puis tu sais, commeje te le disais, dans la majorité des cas, un hashcode sera bien plus long qu'un equals.
 
Sinon je suis d'accord pour dire que c'est un pattern intéressant. D'ailleur je l'ai déjà utilisé ... ;)


Message édité par benou le 15-08-2002 à 00:37:08
n°195545
gfive
Posté le 15-08-2002 à 00:38:22  profilanswer
 

DarkLord a écrit a écrit :

 
 
conclusion que je partage  [:titprem]  




 
Quand même, faut en écrire, des conneries pour arriver à pondre un résumé aussi efficace de la situation! :D

mood
Publicité
Posté le 15-08-2002 à 00:38:22  profilanswer
 

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
[Java] remplacer 1 séquence de caractère par 1 autre dans un String[Java] Lire un long dans un fichier écrit en C
[java]instancier un objet dans un process séparé[JAVA]Comment fonctionne la méthode getClass( ) ...
[JS] Probleme de select à choix multiplesParser du XML avec les API Java
[Java] Comment passer de l'hexa en décimale ?récupérer la console java -> jTextArea
[JAVA] Interface de Login[Java - servlet] 2 Trucs : afficher page html - paramètre par défaut
Plus de sujets relatifs à : [Java] problème avec le switch


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR