Utiliser un hashmap dans un hashmap

Bonsoir,
En fait j'ai besoin d'aide. je sais pas bien utiliser les hashmap mais je voudrais déclarer un hashmap dans un hashmap comme par exemple
HashMap<Long, <String,Integer>> cache = new HashMap<Long,<String, Integer>>();
mais Netbeans n'accepte pas ce genre de déclaration
Comme faire svp parce que j'ai besoin de faire ceci
cache.put(id1,(Get,400)); // id1 de type Long ,Get de type String
cache.put(id2,(Get,600));
cache.put(id1,(Get,(390));
cache.put(id1,(Post,60));
cache.put(id2,(Post,23));
cache.put(id2,(Post,30));
et par la suite je dois parcourir le hashmap pour faire ceci
pour chaque key1 id et pour chaque key2 soit Get soit Post faire la somme de Get ou somme de Post

la résultat obtenu souhaitée c'est: pour id1 sommeGet=790 et sommePost=60
pour id2 sommeGet =600 et sommePost=53
svp aidez moi

8 réponses

  • Votes
  • Date
  • Date décroissante
  1. Modérateur
    Bonjour,

    Il vaut mieux utiliser l'interface Map dans les déclarations, et ne conserver HashMap ou TreeMap que pour l'instanciation des objets. Cela te permettra de changer plus facilement d'implémentation si nécessaire (il n'y aura alors que les new à changer).

    Map<Long, Map<String, Integer>> cache = new HashMap<Long, Map<String, Integer>>();
    
    Map<String, Integer> cache1 = cache.get(id1);
    
    if (cache1==null)
    {
        cache1 = new HashMap<String, Integer>();
        cache.put(id1, cache1);
    }
    
    cache1.put(Get,400);
    1. Bonjour
      la problème c'est que lorsque il s'agit de meme id1 et de meme methode c'est à dire Get ou Post il prend que celle valeur la prochaine valeur ne s'écrit pas
      c'est à dire
      cache1.put(Get,1000);
      cache1.put(Get,500);
      cache.put(id1,cache1);
      lorsqu'on affiche
      juste key: id1 : value {Get=1000}
      alors que je veux qu'il m'affiche la somme
      key: id1 value: {Get=1500}
      svp aidez moi
      1. lorsque tu fais cache1.put(Get,1000);
        tu obtiens {cache1{GET:1000},cache2{...},...}

        et qu'ensuite tu fais cache1.put(Get,500);
        tu écrases l'ancienne entrée {GET:1000} dans cache1
        tu obtiens du coup {cache1{GET:500},cache2{...},...}

        plusieurs solutions:
        - tu n'as pas besoin des différents get que tu fais dans cache
        et tu sauves uniquement la somme:
        cache1.put("Get",1000) => cache1{"GET":1500}
        cache1.put("Get",cache1.get("GET") + 500) => cache1{"GET":1500}
        - ou bien tu as besoin de retrouver tes différents get 1000,500
        tu utilises alors Map<String,Map<String,List<Integer>>>

        pour récupérer la somme, tu fais alors une boucle sur cache1.get("GET")

        suggestions:
        si tout tes entrées au premier niveau de ta map s'appelle cache1,cache2,cacheX
        tu ferais mieux d'utiliser une list ou un tableau pour ton premier niveau
        List<Map<String,Integer>> ou List<Map<String,List<Integer>>> caches
        (en fonction de ce que j'ai dit concernant la tracabilité de tes différents op "GET")
        tu fais caches.get(0) pour avoir cache1, caches.get(1) pour avoir cache2,...
        1. Salut chocobo_tofu1
          j'ai essayé ça marche pas . En fait les valeurs sont obtenue à l'aide d'une autre fonction.

          Moi je veux à chaque id il me fait la somme de GET et somme de POST
          GET ou POST sont aussi obtenue à l'aide d'une autre fonction
          Voici
          String Methode = (String) reo.getProperty("Method"); retourne soit Get soit Post

          int Octet = Integer.parseInt((String) reo.getProperty("taille")); retourne la valeur

          long current_id = reo.getEndNode().getId(); retourne l'id

          cache.put(id; Methode;Octet);
          s'il s'agit du meme id et du meme methode il fait la somme
          svp aidez moi j'ai vraiment besoin de ça
          1. tu vas chercher trop compliquer,
            je pense que cela devrait te suffire

            import java.util.HashMap;
            import java.util.Map;

            public class Cache
            {
            private Map<String,Integer> cache = new HashMap<String,Integer>();

            public void add(long id, String method, int octet)
            {
            String key = id + "_" + method;
            if (cache.containsKey(key))
            cache.put(key, cache.get(key) + octet);
            else
            cache.put(key, octet);
            }

            public int getSum(long id, String method)
            {
            return cache.get(id + "_" + method);
            }

            public static void main(String[] args) {

            Cache cache = new Cache();
            long id1 = 123456;
            long id2 = 456789;
            String GET = "GET";
            String POST = "POST";
            cache.add(id1, GET, 400);
            cache.add(id2, GET, 600);
            cache.add(id1, GET, 390);
            cache.add(id1, POST, 60);
            cache.add(id2, POST, 23);
            cache.add(id2, POST, 30);

            System.out.println(cache.getSum(id1, GET)); //790
            System.out.println(cache.getSum(id1, POST));//60
            System.out.println(cache.getSum(id2, GET));//600
            System.out.println(cache.getSum(id2, POST));//53
            }
            }
            1. Modérateur
              Deux petites corrections pour mieux prendre en compte le cas où on n'a pas la clé :

              public int getSum(long id, String method) 
              { 
                  String key = id + "_" + method;
                  
                  Integer sum = cache.get(key);
                  
                  return sum==null ? 0 : sum;
              } 
              
              public void add(long id, String method, int octet) 
              {
                  String key = id + "_" + method;
              
                  int sum = getSum(id, method) + octet;
                  
                  cache.put(key, sum);
              }
          2. Bonjour chocobo_tofu1
            Merci énormement pour votre aide
            Je veux également ajouter une autre qui fait la division du somme de get par la somme de post pour le meme id ensuite il compare ce ratio à un valeur limite qu'on déclare si ça dépasse la limite il affiche un message sinon elle continue à comparer les autres ratio
            Svp aidez moi
            1. petite précisions:
              - la valeur maximum s'appelle threshold
              - la comparaison des ratios des id se fait dans n'importe quelle ordre
              - s'il n' a pas de valeur de post pour un id alors un message d'erreur s'affiche et la comparaison des ratios s'arrête
              pour changer cela fais return false a la place et met en commentaire le message d'erreur

              import java.util.HashMap;
              import java.util.HashSet;
              import java.util.Map;
              import java.util.Set;

              public class Cache
              {
              private final String GET = "GET";
              private final String POST = "POST";
              private Map<String,Integer> cache = new HashMap<String,Integer>();
              private Set<Long> ids = new HashSet<Long>();
              private double threshold = 0.0;

              public int getSum(long id, String method)
              {
              String key = id + "_" + method;

              Integer sum = cache.get(key);

              return sum==null ? 0 : sum;
              }

              public void add(long id, String method, int octet)
              {
              String key = id + "_" + method;

              int sum = getSum(id, method) + octet;

              cache.put(key, sum);

              ids.add(id);
              }

              private boolean compareRatio(long id)
              {

              if (getSum(id, POST)==0)
              {
              System.out.println("Erreur: " + id + " method " + POST + " = 0");
              return true;
              }
              else if (getSum(id, GET) / getSum(id, POST) > getThreshold())
              {
              System.out.println("Erreur: " + id + " ratio (" + (getSum(id, GET) / getSum(id, POST)) + ") is greater than threshold value " + getThreshold());
              return true;
              }
              else
              {
              //System.out.println(id + " ratio (" + (getSum(id, GET) / getSum(id, POST)) + ") is below threshold value " + getThreshold());
              return false;
              }
              }

              public void compareRatios()
              {
              for (long id : ids)
              {
              if (compareRatio(id))
              break;
              }
              }

              public double getThreshold() {
              return threshold;
              }

              public void setThreshold(double threshold) {
              this.threshold = threshold;
              }

              public static void main(String[] args) {

              Cache cache = new Cache();
              long id1 = 123456;
              long id2 = 456789;
              String GET = "GET";
              String POST = "POST";
              cache.add(id1, GET, 400);
              cache.add(id2, GET, 600);
              cache.add(id1, GET, 390);
              cache.add(id1, POST, 60);
              cache.add(id2, POST, 23);
              cache.add(id2, POST, 30);

              System.out.println(cache.getSum(id1, GET)); //790
              System.out.println(cache.getSum(id1, POST));//60
              System.out.println(cache.getSum(id2, GET));//600
              System.out.println(cache.getSum(id2, POST));//53

              cache.setThreshold(12.0);
              cache.compareRatios();
              }
              }