J'ai besoin de créer une carte qui cache les résultats d'un service de recherche tiers. La demande est composée de deux objets par exemple, Mon idée initiale est de créer un objet à envelopper code> temps code> et Y a-t-il une meilleure façon de le faire, sans avoir besoin d'envelopper la demande dans l'objet TUPLE à chaque fois que nous devons utiliser le cache? P>
Merci beaucoup. P> temps code> et
mois code>. La carte doit mapper entre
(heure, mois) code> et un résultat. P>
mois code> dans un objet TUPLE, donc le cache est une carte entre cet objet et le résultat. < / p>
6 Réponses :
Vous devriez jeter un coup d'œil à Guava Tables si vous Voulez-vous éviter de créer un objet wrapper. P>
Mon idée initiale est de faire un objet pour envelopper
temps code> et
mois code> dans efficacement un objet tuple p>
C'est la bonne idée. Supprimer
hashcode () code> et
égale (objet) code> de votre tuple pour le faire fonctionner avec
hashmap
code> ou comparète ) code> pour le faire fonctionner avec
Treemap
Code> P> Y a-t-il une meilleure façon de le faire? P> blockQuote>
Ceci est la voie la plus simple, à moins que vous n'ayez une classe qui puisse remplacer
timoitrtupple code> avec quelque chose qui a du sens. Par exemple, le temps et la date peuvent être combinés dans une date code> objet code>. P>
Dans certains cas, vous pouvez créer une clé basée sur une enveloppe primitive. Par exemple, si
temps code> est exprimé comme le nombre de minutes depuis minuit et
mois code> est un nombre compris entre 1 et 12, inclus, vous pouvez envelopper les deux valeurs dans un
Integer code>, et utilisez-le comme clé: p>
xxx pré> blockQuote>
Vous pouvez créer une carte des cartes: de sorte que vous appeliez: p> pour récupérer une valeur (à condition que vous ont déjà ajouté une valeur pour Ce n'est pas particulièrement agréable d'utiliser directement, car vous auriez besoin de beaucoup de mois code>). p>
contenant code> / < Code> NULL code> chèques. Vous pouvez envelopper une classe de commodité: p>
Je vais le faire de cette façon aussi, mais faites attention lorsque vous définissez une clé d'un hashmap: il devrait être immuable, car, autrement changeant, cela pourrait compromettre le mappage et le hachage et doit mettre en œuvre les deux exigences de la clé de hachage: HashCode et des méthodes équivalent.
Quelque chose comme ceci:
Si vous ne voulez pas utiliser une carte des cartes (pas très sympa, mais cela fonctionne), vous avez encore des choix ... Par exemple, stocker le mois et l'heure dans une chaîne, en utilisant quelque chose comme
DateFormat DS = Nouveau SimpleDateFormat (MM HH: MM: S) Code>, puis Utilisez pour convertir un objet de calendrier rempli de vos valeurs
Calendar cal = Calendar.getInstance();
cal.set(Calendar.MONTH, yourmonth);
cal.set(Calendar.HOUR_OF_DAY, yourhours);
cal.set(Calendar.MINUTE, yourminutes);
cal.set(Calendar.SECOND, yoursecs);
String val_to_store=ds.format(cal.getTime());
Excellente question!
Tout d'abord, la réponse de @dasblinkenlight est correcte, disons, la plupart du temps. Construire une seule clé d'objet est la solution la plus simple et la plus évidente. Il est facile de comprendre et de bien comprendre. Si ce cache n'est pas le point chaud de votre application, aucune nouvelle pensée n'est nécessaire. P>
Cependant, il existe des alternatives, ce qui peut générer une meilleure efficacité. P>
conceptuel, il existe deux possibilités: p>
store.get (mois) .get (heure) code> li>
ul> Pour la recherche hiérarchique, aucune allocation d'objet supplémentaire n'est nécessaire, cependant, vous l'échangez pour un deuxième accès de table de hachage. Pour être la plus efficace de la mémoire, il est important de mettre la clé avec l'espace de valeur la plus petite d'abord. P>
S'il s'agit d'un endroit très central de votre application, une approche encore meilleure est de mettre la première étape de la recherche, Les douze mois, dans un tableau et l'initialisent sur le démarrage: p> xxx pré> J'ai fait une référence de comparaison pour les dates de formatage avec la datedromatter. Ces coutures similaires à votre cas d'utilisation. Cela a en fait trois composantes clés: date, format et locale. Vous pouvez le trouver ici: https://github.com/adissue/cache2k-benchmark/blob/master/zoo/src/test/java/org/cache2k/benchmark/dateformattingbenk.java p>
My Le résultat était qu'il n'existe en réalité pas de différentes différences d'exécution entre l'attribution d'un objet pour les touches composées ou la recherche de cache à trois niveaux sans allocation d'objet pour la clé. Cependant, le cadre de référence usagé ne tient pas compte correctement de la collecte des ordures. Je ferai une évaluation plus approfondie après que je suis passé à un autre cadre de référence. P> p>
Temps et mois..mmhh, que diriez-vous de la combiner à une date et de créer votre clé de carte?
"Y a-t-il une meilleure façon de faire ça" Que percevez-vous d'être mauvais à ce sujet?
Pourriez-vous donner un exemple avec l'utilisation de la classe que vous souhaitez faire et le (s) résultat (s) exceptionnel (s)? (En fait, je ne suis pas sûr de comprendre ce que vous aimeriez faire.)
@MAhout Certains exemples de données amélioreraient vraiment cette question. Par "temps" Vous voulez dire un temps-de-jour tel que
16:23 code>? J'ai du mal à imaginer quelle est la signification d'un mois + temps de jour.