IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

[Debutant(e)] [hashmap] interface interne Map.Entry


Sujet :

Collection et Stream Java

  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Par défaut [Debutant(e)] [hashmap] interface interne Map.Entry
    Bonjour,

    j'ai un probleme avec la methode removeEldestEntry des LinkedHashMap.
    voici une partie du code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    public class ma_classe{
     
     private Map maplhm;
     private static final int MAX = 5;
     
     public ma_classe(){
       maplhm= new LinkedHashMap();
     }
     
     protected boolean removeEldestEntry(Map.Entry eldest) {
      return maplhm.size() > MAX;
     }
     
     public void ajouter (Val v){
      if(removeEldestEntry(maplhm.entrySet())== true)  //pas bon
          maplhm.remove(maplhm.size());                      //pas bon
      maplhm.put(cle,v);  //cle non indiquée ici mais fonctionne
     }
     
    }
    le pb c'est : removeEldestEntry(maplhm.entrySet())
    le parametre n'est pas bon apparemment.
    le compilo dit:
    removeEldestEntry(java.util.Map.Entry) in ma_classe cannot be applied to (java.util.Set)


    le but de la methode ajouter est de tester d'abord si la map contient le nb max d'entrées. Si c'est le cas, elle doit supprimer le premier element ajouté (le + ancien). et je ne sais pas comment indiquer quel est l'élément le + ancien.

    dc 2 pbs:
    1) le parametre de removeEldestEntry
    2) trouver l'élément le premier ajouté ds la map dc le + ancien


    dc si vous pouviez m'aider.
    merci




    [Modéré par Didier] : ajout de tag dans le titre - Les règles du forum Java

  2. #2
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Par défaut
    personne n'a une idée?

  3. #3
    Membre éclairé
    Avatar de rozwel
    Inscrit en
    Mars 2002
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 324
    Par défaut Re: [Debutant(e)] hash map : interface interne Map.Entry
    Citation Envoyé par debdev
    1) le parametre de removeEldestEntry
    Effectivement il y a un problème là, et pas qu'un même Alors on la refait en moins crispé...

    - maplhm est de type java.util.Map
    - la méthode entrySet() de Map retourne un java.util.Set
    - et removeEldestEntry() prend un paramètre un Map.Entry

    Donc déjà rien que sur le plan théorique il y a un problème, et c'est ce que le compilo te dit.

    Bon avant de pouvoir résoudre ce petit problème il faut clarifier ce qu'est sensé faire la méthode removeEldestEntry :
    - le nom de la méthode contient "remove" mais elle ne remove rien du tout.
    - elle prend un paramètre qui n'est jamais utilisé dans le corps de la méthode

    Au passage je viens de remarquer qu'il y avait une méthode removeEldestEntry dans LinkedHashMap et que la doc de cette méthode était plutôt... obscure.

    2) trouver l'élément le premier ajouté ds la map dc le + ancien
    Pour savoir quel est l'élement le plus ancien, il faut que ta map ait une notion des dates d'ajout ou plus simplement que tu utilises le fait que les entrées de ta Map sont stockées en liste chaînée, ce qui veut dire que l'élément le plus ancien est le premier élément de la liste.

    J'essaie de faire un bout de code qui fait ce que tu as dit et je te le poste quand j'ai fini...

  4. #4
    Membre éclairé
    Avatar de rozwel
    Inscrit en
    Mars 2002
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 324
    Par défaut
    Voilà, j'ai quelque chose qui fonctionne. Maintenant à savoir si ça fait ce que tu veux et si ça s'intègre avec ce que t'as déjà, c'est une autre paire de manches. J'ai du imaginer une classe interne Val et bricoler un truc pour la clé mais voila ce que ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
     
    import java.util.*;
     
    public class CacheTest{
    	private Map maplhm;
    	private int maxSize;
    	private static int counter = 0;
     
    	public CacheTest(){
    		maplhm = new LinkedHashMap();
    		maxSize = 100;
    	}
     
    	public CacheTest(int ms){
    		maplhm = new LinkedHashMap();
    		maxSize = ms;
    	}
     
    	public void ajouter(Val v){
    		if(maplhm.size() > this.maxSize) removeEldestEntry();
    		Integer cle = new Integer(counter++);
    		maplhm.put(cle, v);
    	}
     
    	/**
             * La méthode removeEldestEntry n'a pas besoin qu'on lui spécifie
             * quelle entrée enlever puisqu'on lui dit d'enlever la plus ancienne
             * Et comme les entrées sont stockées dans l'ordre d'arrivée, la plus
             * ancienne est aussi la premi�re dans l'ordre d'itération.
             * Cette méthode retourne true si elle a effectivement supprimé une
             * entrée.
             */
    	private boolean removeEldestEntry(){
    		Iterator it = maplhm.keySet().iterator();
    		if(it.hasNext()){ //S'il y a au moins une entrée
    			Object key = it.next();
    			//Normalement arrivé à ce stade Map.remove() retourne
    			//forcément true mais bon... soyons rigoureux :P
    			return (maplhm.remove(key) != null);
    		}
    		else
    			return false;
    	}
     
    	public String toString(){
    		return maplhm.toString();
    	}
     
    	static class Val{
    		private Object v;
     
    		public Val(Object value){
    			v = value;
    		}
     
    		public String toString(){
    			return v.toString();
    		}
    	}
     
    	public static void main(String[] args){
    		CacheTest test = new CacheTest(10);
    		for(int i = 0; i < 30; i++){
    			Val v = new Val("entree" + i);
    			test.ajouter(v);
    			System.out.println("Après ajout de " + v.toString() + "\n" + test.toString());
    		}
    	}
    }
    Finalement j'ai pas surchargé la méthode removeEldestEntry() parce que je la trouve vraiment étrange (surtout le paramètre qui n'a pas grand chose à faire là puisqu'on peut le déduire tout seul). Donc j'ai défini une autre removeEldestEntry() sans paramètre et j'ai externalisé le test sur la taille dans ajouter.
    N'hésite pas à dire s'il y a un truc que tu ne comprends pas ou si tu as d'autres problèmes.

    Bon courage.

    @+++

  5. #5
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Par défaut

    ça marche!!!!
    MERCI ! MERCI ! MERCI ! ...........MERCI !

    tu peux pas imaginer a quel point je te remercie, c'est trop EXCELLENT

    PS: encore merci

  6. #6
    Membre éclairé
    Avatar de rozwel
    Inscrit en
    Mars 2002
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 324
    Par défaut
    Bienvenue! ça fait plaisir de faire plaisir

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. boucle Map.Entry .next
    Par totoche dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 13/01/2010, 17h39
  2. HashMap d'Hash Map?
    Par cotede2 dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 16/10/2008, 13h07
  3. implémentation de l'interface Map.Entry
    Par caro_caro dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 18/05/2008, 23h31
  4. [Debutant]Transférer une interface sous netbeans dans eclipse
    Par smillingbandit dans le forum NetBeans
    Réponses: 3
    Dernier message: 28/01/2008, 09h03
  5. Configuration réseau interface interne
    Par troumad dans le forum Debian
    Réponses: 12
    Dernier message: 06/09/2006, 09h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo