OVH Cloud OVH Cloud

Objet FIFO/Hashtable de taille limitée

6 réponses
Avatar
benoit
Bonjour à tous,

J'ai besoin d'une classe un peu bizarre.
- elle doit permettre de stocker des objets (comme une collection),
- elle ressemblerait à une Hashtable dans le sens où on pourrait
interroger un élément par sa clé,
- mais en plus à partir d'un nombre d'éléments décidé au départ, le
plus ancien serait viré (selon le principe FIFO).

Est-ce qu'un tel objet existe déjà ? (j'imagine que non).
Sur lequel m'appuyer pour que l'implémentation soit la plus simple
possible ?

Merci d'avance à tous.

6 réponses

Avatar
Cédric Olmanst
Bonjour à tous,

J'ai besoin d'une classe un peu bizarre.
- elle doit permettre de stocker des objets (comme une collection),
- elle ressemblerait à une Hashtable dans le sens où on pourrait
interroger un élément par sa clé,
- mais en plus à partir d'un nombre d'éléments décidé au départ, le
plus ancien serait viré (selon le principe FIFO).

Est-ce qu'un tel objet existe déjà ? (j'imagine que non).
Sur lequel m'appuyer pour que l'implémentation soit la plus simple
possible ?

Merci d'avance à tous.


Ca m'étonnerait que le type de Collection que tu demandes existe, mais
tu peux le créer très facilement en à peine quelques minutes, en faisant
une classe qui hérite de HashMap.

Tu y stockes le nombre d'éléments, et tu redéfinis la méthode put :

if (nombreDElements == tailleMax) {
supprimer le plus ancien
}
appeler le put du parent

Le seul problème serait de trouver lequel est le plus ancien, par
contre. Euh... ben réfléchis :op

Ced

Avatar
Black Myst
Cédric Olmanst wrote:
Bonjour à tous,
J'ai besoin d'une classe un peu bizarre.
- elle doit permettre de stocker des objets (comme une collection),
- elle ressemblerait à une Hashtable dans le sens où on pourrait
interroger un élément par sa clé,
- mais en plus à partir d'un nombre d'éléments décidé au départ, le
plus ancien serait viré (selon le principe FIFO).

Est-ce qu'un tel objet existe déjà ? (j'imagine que non).
Sur lequel m'appuyer pour que l'implémentation soit la plus simple
possible ?

Merci d'avance à tous.


Ca m'étonnerait que le type de Collection que tu demandes existe, mais
tu peux le créer très facilement en à peine quelques minutes, en faisant
une classe qui hérite de HashMap.

Tu y stockes le nombre d'éléments, et tu redéfinis la méthode put :

if (nombreDElements == tailleMax) {
supprimer le plus ancien
}
appeler le put du parent

Le seul problème serait de trouver lequel est le plus ancien, par
contre. Euh... ben réfléchis :op
Je pense que tu peux t'en sortir facilement avec une LinkedHashMap.

Cette map conservant l'ordre d'insertion des clés, tu retrouvera la
plus ancienne en fin de liste...

Black Myst


Avatar
Alain
tu ne chercherais pas a faire un cache LRU ?

pourquoi réinventer un Nieme cache...

http://java-source.net/open-source/cache-solutions
un collègue a utilisé avec bonheur
http://ehcache.sourceforge.net/

en changeant la config tu passe de LRU a LFU, tu ajuste divers détails...
et en plus tu peux sans te fatiguer créer plein de cache selon tes
besoins... sans craindre de te fatiguer...

un peu plus lourd au début, mais au moins il ne sera pas à débugger
comme ce qu'on fait a la main ... (nb: j'ai fait comme toi avant, je sais!)


J'ai besoin d'une classe un peu bizarre.
- elle doit permettre de stocker des objets (comme une collection),
- elle ressemblerait à une Hashtable dans le sens où on pourrait
interroger un élément par sa clé,
- mais en plus à partir d'un nombre d'éléments décidé au départ, le
plus ancien serait viré (selon le principe FIFO).


Avatar
Bruno Jouhier
As-tu vraiment besoin que ça soit la *dernière* entrée qui parte?

Si tu veux juste un cache avec N entrées max et que tu n'as pas vraiment
besoin d'une sémantique FIFO stricte mais plutôt que les derniers objets
aient plus de chance que les anciens d'être dans le cache, tu peux t'en
sortir avec un tableau tout bête à N entrées (il faut aussi que chaque objet
ait une méthode getKey() qui donne la clé, ce qui est un cas fréquent).

La fonction de cache est tt simplement:

Object getObject(object key)
{
int index = Math.abs(key.hashCode()) % N;
obj = array[index]
if (obj == null || !obj .getKey().equals(key))
{
// not found in cache, load it and cache it
obj = loadObject(key);
array[index] = obj;
}
return obj;
}

Bruno

"benoit" a écrit dans le message de news:

Bonjour à tous,

J'ai besoin d'une classe un peu bizarre.
- elle doit permettre de stocker des objets (comme une collection),
- elle ressemblerait à une Hashtable dans le sens où on pourrait
interroger un élément par sa clé,
- mais en plus à partir d'un nombre d'éléments décidé au départ, le
plus ancien serait viré (selon le principe FIFO).

Est-ce qu'un tel objet existe déjà ? (j'imagine que non).
Sur lequel m'appuyer pour que l'implémentation soit la plus simple
possible ?

Merci d'avance à tous.


Avatar
Jack
benoit a présenté l'énoncé suivant :
Bonjour à tous,

J'ai besoin d'une classe un peu bizarre.
- elle doit permettre de stocker des objets (comme une collection),
- elle ressemblerait à une Hashtable dans le sens où on pourrait
interroger un élément par sa clé,
- mais en plus à partir d'un nombre d'éléments décidé au départ, le
plus ancien serait viré (selon le principe FIFO).

Est-ce qu'un tel objet existe déjà ? (j'imagine que non).
Sur lequel m'appuyer pour que l'implémentation soit la plus simple
possible ?

Merci d'avance à tous.


Ca existe dans jakarta commons collection

http://jakarta.apache.org/commons/collections/api-release/org/apache/commons/collections/buffer/CircularFifoBuffer.html

http://minilien.com/?sYMnUpVVkC

Avatar
Jack
benoit a présenté l'énoncé suivant :
Bonjour à tous,

J'ai besoin d'une classe un peu bizarre.
- elle doit permettre de stocker des objets (comme une collection),
- elle ressemblerait à une Hashtable dans le sens où on pourrait
interroger un élément par sa clé,
- mais en plus à partir d'un nombre d'éléments décidé au départ, le
plus ancien serait viré (selon le principe FIFO).

Est-ce qu'un tel objet existe déjà ? (j'imagine que non).
Sur lequel m'appuyer pour que l'implémentation soit la plus simple
possible ?

Merci d'avance à tous.


Ca existe dans jakarta commons collection

http://jakarta.apache.org/commons/collections/api-release/org/apache/commons/collections/buffer/CircularFifoBuffer.html

http://minilien.com/?sYMnUpVVkC


Pardon, j'ai mal lu la question, j'ai trouvé çà

http://www.experts-exchange.com/Programming/Programming_Languages/Java/Q_11627598.html

Le poste de "bazarny" propose une implémentation.