Java hashtable clé à deux éléments
Résolu/Fermé
c.limero
Messages postés
7
Date d'inscription
samedi 3 décembre 2011
Statut
Membre
Dernière intervention
4 décembre 2011
-
Modifié par c.limero le 3/12/2011 à 21:16
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 4 déc. 2011 à 15:20
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 4 déc. 2011 à 15:20
A voir également:
- Java hashtable clé à deux éléments
- Clé windows 10 gratuit - Guide
- Waptrick java football - Télécharger - Jeux vidéo
- Clé usb non détectée - Guide
- Jeux java itel football - Télécharger - Jeux vidéo
- Java apk - Télécharger - Langages
5 réponses
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
3 déc. 2011 à 21:19
3 déc. 2011 à 21:19
Tu pourrais faire deux HashMap<Integer,Stone> la première avec les userID comme clé, la deuxième avec les itemID. À moins que tes entiers soient très différent (aucun userID commun avec les itemID) auquel cas tu peux carrément tout mettre dans la même map.
Remarque : Les objets Stone ne seront pas copiés puisqu'on ne manipule que les références, ça reste donc assez souple en mémoire.
Tu peux bien sûr te créer une petite classe pour manipuler tes map et être sûr d'être cohérent dans la manipulation de tes données.
Remarque : Les objets Stone ne seront pas copiés puisqu'on ne manipule que les références, ça reste donc assez souple en mémoire.
Tu peux bien sûr te créer une petite classe pour manipuler tes map et être sûr d'être cohérent dans la manipulation de tes données.
class doubleMap { private final HashMap<Integer,Stone> mapUser; private final HashMap<Integer,Stone> mapItem; public boolean put(Integer userID,Integer itemID,Stone s) { return mapUser.add(userID,s) && mapItem.add(itemID,s); } public Stone getUser(Integer userID) { return mapUser.get(userID); } public Stone getItem(Integer itemID) { return mapItem.get(itemID); } }
c.limero
Messages postés
7
Date d'inscription
samedi 3 décembre 2011
Statut
Membre
Dernière intervention
4 décembre 2011
3 déc. 2011 à 21:25
3 déc. 2011 à 21:25
Bonsoir KX,
Si un meme utilisateur ajoute deux pierres, elles auront un itemID différent, mais le meme userID. Inversement, si deux utilisateurs ajoutent une pierre, elles auront un userID différent, mais rien ne garanti qu'elles n'auront pas le meme itemID.
Je ne peux donc pas envisager cette solution :/
Si un meme utilisateur ajoute deux pierres, elles auront un itemID différent, mais le meme userID. Inversement, si deux utilisateurs ajoutent une pierre, elles auront un userID différent, mais rien ne garanti qu'elles n'auront pas le meme itemID.
Je ne peux donc pas envisager cette solution :/
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
3 déc. 2011 à 21:44
3 déc. 2011 à 21:44
Bon j'avoue que je n'avais pas forcément bien compris le problème ^^
Alors peut-être que tu peux utiliser une HashMap<Identifiant,Stone> avec :
Alors peut-être que tu peux utiliser une HashMap<Identifiant,Stone> avec :
class Identifiant { private final int user; private final int item; public Identifiant(int userID,int itemID) { user=userID; item=itemID; } @Override public boolean equals(Object obj) { if (obj instanceof Identifiant) { Identifiant id = (Identifiant) obj; return id.user==user && id.item==item; } else return false; } @Override public int hashCode() { return user*item; // par exemple } }
c.limero
Messages postés
7
Date d'inscription
samedi 3 décembre 2011
Statut
Membre
Dernière intervention
4 décembre 2011
3 déc. 2011 à 22:30
3 déc. 2011 à 22:30
J'ai bien pensé à un truc comme ça, mais je ne vois pas de hashCode permettant de distinguer à coup sur un couple.
Par exemple là, la clé (2,1) est la meme que la clé (1,2), ce que je en veux pas.
C'est d'autant plus difficile que l'itemID est donné par le client. et ce n'est pas forcément moi qui code le client, les projets de tous ceux de ma promo doivent pouvoir se connecter à mon serveur, donc mon hashCode doit etre sûr
Par exemple là, la clé (2,1) est la meme que la clé (1,2), ce que je en veux pas.
C'est d'autant plus difficile que l'itemID est donné par le client. et ce n'est pas forcément moi qui code le client, les projets de tous ceux de ma promo doivent pouvoir se connecter à mon serveur, donc mon hashCode doit etre sûr
c.limero
Messages postés
7
Date d'inscription
samedi 3 décembre 2011
Statut
Membre
Dernière intervention
4 décembre 2011
3 déc. 2011 à 22:43
3 déc. 2011 à 22:43
http://www.bouleis.fr/public/Compilation/javadoc/share/Couple.html
cette classe serait parfaite, mais elle n'a pas l'air d'exister "en vrai" (eclipse ne sait pas faire d'import pour cette classe)
cette classe serait parfaite, mais elle n'a pas l'air d'exister "en vrai" (eclipse ne sait pas faire d'import pour cette classe)
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
Modifié par KX le 3/12/2011 à 22:46
Modifié par KX le 3/12/2011 à 22:46
Une classe Couple c'est exactement ce que j'ai fait tout à l'heure...
Si le hashCode est identique pour deux identifiants différents la méthode equals est appelé, donc ce n'est pas un problème pour (1,2) et (2,1), parce qu'après on aura 1==2 && 2==1 qui donnera false.
Du coup les deux identifiants seront différents tu n'as pas à t'en faire pour ça.
L'intérêt du hashCode est de comparer deux identifiants de manière plus rapide que l'appel de equals. En fait user*item comme je l'ai fait tout à l'heure c'est trop compliqué pour être vraiment intéressant. il vaudrait mieux faire un hashCode qui retourne juste user (ou item) comme ça si les deux users sont identiques on appelle equals pour comparer user ET item (donc on aura fait 3 comparaisons), mais en général on les deux users sont différents avec le hashCode on n'aura comparé que l'user (et donc fait 1 seule comparaison). En moyenne on fait donc moins de 2 comparaisons c'est plus rapide. Après à toi de voir s'il est plus intéressant de mettre user ou item pour qu'on appelle le moins souvent equals. Mais tout ceci ce n'est que de l'optimisation, ça ne change rien au fait que de toute façon le hashCode est complété par equals.
Si le hashCode est identique pour deux identifiants différents la méthode equals est appelé, donc ce n'est pas un problème pour (1,2) et (2,1), parce qu'après on aura 1==2 && 2==1 qui donnera false.
Du coup les deux identifiants seront différents tu n'as pas à t'en faire pour ça.
L'intérêt du hashCode est de comparer deux identifiants de manière plus rapide que l'appel de equals. En fait user*item comme je l'ai fait tout à l'heure c'est trop compliqué pour être vraiment intéressant. il vaudrait mieux faire un hashCode qui retourne juste user (ou item) comme ça si les deux users sont identiques on appelle equals pour comparer user ET item (donc on aura fait 3 comparaisons), mais en général on les deux users sont différents avec le hashCode on n'aura comparé que l'user (et donc fait 1 seule comparaison). En moyenne on fait donc moins de 2 comparaisons c'est plus rapide. Après à toi de voir s'il est plus intéressant de mettre user ou item pour qu'on appelle le moins souvent equals. Mais tout ceci ce n'est que de l'optimisation, ça ne change rien au fait que de toute façon le hashCode est complété par equals.
c.limero
Messages postés
7
Date d'inscription
samedi 3 décembre 2011
Statut
Membre
Dernière intervention
4 décembre 2011
3 déc. 2011 à 22:47
3 déc. 2011 à 22:47
aaaah génial, je vais essayer ça alors, je n'avais pas compris que les clés fonctionnaient comme ça !
Merci !
Merci !
c.limero
Messages postés
7
Date d'inscription
samedi 3 décembre 2011
Statut
Membre
Dernière intervention
4 décembre 2011
3 déc. 2011 à 23:01
3 déc. 2011 à 23:01
je viens de faire le test, et ça fonctionne très bien, je te remercie vraiment beaucoup !
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
4 déc. 2011 à 14:03
4 déc. 2011 à 14:03
Remarque : en y repensant il serait peut-être mieux d'utiliser une map de type ConcurrentHashMap<Integer,ConcurrentHashMap<Integer,Stone>>
Concurrent, c'est parce que tu vas être sur ton serveur et que plusieurs personnes pourraient y accéder en même temps. Et l'imbrication des deux c'est pour t'éviter ton type couple, et la manipulation du hashCode, parce qu'en fait si il y a beaucoup de hashCode identiques tu risque de faire beaucoup de tests equals et perdre en efficacité.
Du coup on considère que chaque utilisateur a sa propre HashMap où l'on récupère les item.
Concurrent, c'est parce que tu vas être sur ton serveur et que plusieurs personnes pourraient y accéder en même temps. Et l'imbrication des deux c'est pour t'éviter ton type couple, et la manipulation du hashCode, parce qu'en fait si il y a beaucoup de hashCode identiques tu risque de faire beaucoup de tests equals et perdre en efficacité.
Du coup on considère que chaque utilisateur a sa propre HashMap où l'on récupère les item.
Stone put(Integer userID,Integer itemID,Stone s) { if (!map.contains(userID)) map.put(userID,new ConcurrentHashMap<Integer,Stone>()); return map.get(userID).put(itemID,s); } Stone get(Integer userID,Integer itemID) { if (!map.contains(userID)) return null; else return map.get(userID).get(itemID,s); }
c.limero
Messages postés
7
Date d'inscription
samedi 3 décembre 2011
Statut
Membre
Dernière intervention
4 décembre 2011
4 déc. 2011 à 15:04
4 déc. 2011 à 15:04
C'est gentil mais maintenant que ça marche, je n'ai plus le temps de tout modifier, je dois rendre mon projet à la fin de la semaine et je suis loin d'avoir fini ;)
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
4 déc. 2011 à 15:20
4 déc. 2011 à 15:20
Comme tu veux. Pour un projet futur peut-être ;-)