Utiliser un hashmap dans un hashmap

Fermé
houba91 Messages postés 11 Date d'inscription vendredi 21 mars 2014 Statut Membre Dernière intervention 21 mai 2014 - 13 mai 2014 à 00:00
houba91 Messages postés 11 Date d'inscription vendredi 21 mars 2014 Statut Membre Dernière intervention 21 mai 2014 - 15 mai 2014 à 15:30
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
A voir également:

8 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
13 mai 2014 à 08:13
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
houba91 Messages postés 11 Date d'inscription vendredi 21 mars 2014 Statut Membre Dernière intervention 21 mai 2014
13 mai 2014 à 12:30
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
0
chocobo_tofu1
13 mai 2014 à 12:55
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,...
0
houba91 Messages postés 11 Date d'inscription vendredi 21 mars 2014 Statut Membre Dernière intervention 21 mai 2014
13 mai 2014 à 13:42
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
}
}
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
13 mai 2014 à 18:36
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);
}
0
houba91 Messages postés 11 Date d'inscription vendredi 21 mars 2014 Statut Membre Dernière intervention 21 mai 2014
14 mai 2014 à 10:48
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
0
chocobo_tofu1
15 mai 2014 à 11:40
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();
}
}
0
houba91 Messages postés 11 Date d'inscription vendredi 21 mars 2014 Statut Membre Dernière intervention 21 mai 2014
15 mai 2014 à 15:30
Merci énormément pour votre aide Mr chocobo_tofu1
0