2010-05-13 4 views
1

Ce dont j'ai besoin, c'est quelque chose comme Hashtable que je vais remplir avec des prix qui étaient réels aux jours souhaités. Par exemple: Je vais mettre deux prix: 1er janvier: 100 USD, 5 mars: 89 USD.J'ai besoin d'une structure de données pour un traitement efficace avec des dates

Si je recherche ma hashtable pour le prix: hashtable.get (14 février) J'en ai besoin pour me redonner le prix actuel qui a été entré au 1er janvier parce que c'est le dernier prix actuel. L'implémentation de hashtable normale ne me rendra rien, car il n'y a rien mis sur ce dat.

J'ai besoin de voir s'il y a une telle implémentation qui peut trouver rapidement un objet en fonction de la plage de dates.

Répondre

5

En haut de ma tête, il y a quelques façons, mais j'utiliserais un TreeMap<Date> (ou Calendar, etc.).

Lorsque vous devez retirer un Date date, essayez ce qui suit:

  1. Tentative de get(date)
  2. Si le résultat est null, alors le résultat est headMap(date).lastKey()

L'un de ces marchera. Bien sûr, vérifiez d'abord la taille de headMap(date) car lastKey() lancera un Exception s'il est vide.

+2

+1 C'est la bonne façon de le faire. Peut être amélioré un peu avec Java 6, en utilisant TreeMap.floorEntry (date) –

+0

Merci pour le conseil sur floorEntry! – Phil

+0

+1 n'était pas au courant de cette fonctionnalité de 'TreeMap'! –

0

Vous pouvez utiliser un objet DatePrice qui contient les deux et les conserver dans une liste ou un tableau sorte par date, puis utiliser la recherche binaire (disponible dans les classes Collections et Arrays) pour trouver la date la plus proche. Cela aurait nettement plus d'impact sur la mémoire que l'utilisation de TreeMap, et il ne semble pas que vous souhaitiez insérer ou supprimer des données de manière aléatoire (ce qui entraînerait de mauvaises performances avec un tableau).

+0

non .. juste besoin de remplir le cache des prix de la base de données afin que je n'ai pas à frapper DB à tout moment j'ai besoin d'un prix pour un produit à une date aléatoire. Les prix ne changeront pas tous les jours, peut-être une fois par mois, ce qui est crucial, c'est de trouver rapidement le prix qu'il fallait laisser dire il y a 10 ans à une date précise. –

0

Créer une arborescence avec date, chaîne. Si quelqu'un appelle une date, alors convertissez la chaîne à date et appelez map.get (date), si vous trouvez alors prenez la clé précédente que l'élément courant.

0

Vous avez tous vos outils à portée de main. Considérez un TreeMap. Ensuite, vous pouvez créer un headmap, qui contient seulement la partie de la carte qui est strictement inférieure à une valeur donnée. Exemple de mise en œuvre:

TreeMap<Date,Double> values = new TreeMap<Date,Double>(); 
...fill in stuff... 
Date searchDate = ...anydate... 
// Needed due to the strictly less contraint: 
Date mapContraintDate = new Date(searchDate.getTime()+1); 
Double searchedValue = values.get(values.headMap(mapContraintData).lastKey); 

Ceci est efficace, parce que le headMap est crée pas en copiant la carte d'origine, mais retourne une seule vue.

Questions connexes