6
votes

Java carte entre paires et valeurs

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, temps et mois . La carte doit mapper entre (heure, mois) et un résultat.

Mon idée initiale est de créer un objet à envelopper temps et mois dans un objet TUPLE, donc le cache est une carte entre cet objet et le résultat. < / p>

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?

Merci beaucoup.


4 commentaires

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 ? J'ai du mal à imaginer quelle est la signification d'un mois + temps de jour.


6 Réponses :


0
votes

Vous devriez jeter un coup d'œil à Guava Tables si vous Voulez-vous éviter de créer un objet wrapper.


0 commentaires

5
votes

Mon idée initiale est de faire un objet pour envelopper temps et mois dans efficacement un objet tuple

C'est la bonne idée. Supprimer hashcode () et égale (objet) de votre tuple pour le faire fonctionner avec hashmap ou comparète ) pour le faire fonctionner avec Treemap

Y a-t-il une meilleure façon de le faire?

Ceci est la voie la plus simple, à moins que vous n'ayez une classe qui puisse remplacer timoitrtupple avec quelque chose qui a du sens. Par exemple, le temps et la date peuvent être combinés dans une date objet .

Dans certains cas, vous pouvez créer une clé basée sur une enveloppe primitive. Par exemple, si temps est exprimé comme le nombre de minutes depuis minuit et mois est un nombre compris entre 1 et 12, inclus, vous pouvez envelopper les deux valeurs dans un Integer , et utilisez-le comme clé: xxx


0 commentaires

0
votes

Vous pouvez créer une carte des cartes: xxx

de sorte que vous appeliez: xxx

pour récupérer une valeur (à condition que vous ont déjà ajouté une valeur pour mois ).

Ce n'est pas particulièrement agréable d'utiliser directement, car vous auriez besoin de beaucoup de contenant / < Code> NULL chèques. Vous pouvez envelopper une classe de commodité: xxx


0 commentaires

0
votes

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: xxx


0 commentaires

0
votes

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());


0 commentaires

0
votes

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.

Cependant, il existe des alternatives, ce qui peut générer une meilleure efficacité.

conceptuel, il existe deux possibilités:

  • construisez un seul objet clé pour les touches composées. C'est un modèle commun et assez typique si vous utilisez des touches composées pour l'accès à la base de données
  • Faites une recherche hiérarchique de deux ou plusieurs niveaux, E.g.: store.get (mois) .get (heure)

    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.

    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: xxx

    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

    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.


0 commentaires