itereren over een HashMap<String, ArrayList<Double>>()

Status
Niet open voor verdere reacties.

Clemens Schalkw

Gebruiker
Lid geworden
5 dec 2007
Berichten
166
kan iemand mij vertellen hoe ik alle gegevens gestructureerd uit de volgende HashMap kan halen?

HashMap<String, ArrayList<Double>>()

Wat ik doe is hetvolgende:

Code:
public class myClass {

  protected String maaktNietUit;
  protected HashMap<String, ArrayList<Double>> map;

  public void init(String maaktNietUit) {

    this.maaktNietUit = maaktNietUit;
    map = new HashMap<String, ArrayList<Double>>();
  }

  public void myMethod(Event event) {

      String blaat = eenVariabele;

      if (maaktNietUit.equals(blaat) {

        if (!map.containsKey(blaat))
          map.put(blaat, new ArrayList<Double>();
        map.get(blaat).add(deDoubleVariabele));
      }
  }
}

nu wil ik eigenlijk per key van de HashMap de size van de key van de ArrayList hebben (dus ArrayList.size()) (dus het aantal key's in de ArrayList) en het totaal vann de doubles per key van de HashMap.

Laat zeggen dat hetvolgende in de HashMap staat:

hashmapKey1 - 2.0
hashmapKey1 - 4.0
hashmapKey1 - 1.5

hashmapKey2 - 3.0
hashmapKey2 - 4.5

dan moet ik dus de volgende output hebben:

(hashmapkey - aantal key's van ArrayList - totaal opgetelde doubles per hashmapkey)

hashmapKey1 - 3 - 7.5
hashmapKey2 - 2 - 7.5
 
Laatst bewerkt:
je bent op zoek naar een set, dit is een interface dus dan moet je een HashSet hebben. de set kun je vullen door een methode van je hashmap aan te roepen
 
Waarom zou ik een Set moeten hebben?
Er wordt gekeken of de key al bestaat, zo ja voeg dan de ArrayList<Double> toe, zo nee maak een nieuwe key en zet de waarden erin.

Zo is de key ook altijd uniek.
Maargoed, volgens mij komt alles al in de HashMap te staan, het gaat er om dat ik de waarden eruit kan halen op de manier die ik beschreven heb in mijn eerste post.
 
Voor de Map is KeySet een handig functie hier mee krijg je alle keys terug. Doordat je generics gebruikt :thumb: hoeft je niks te casten...

Code:
for (String key : map.keySet()) {
	 double totaal = 0;
	for (double getal : map.get(key)) {
	     totaal+= getal;
	}
	System.out.println("Key: " + key + " aantal in list" + map.get(key).size() + " totaal: " + totaal);  
}

Je kan ook Apache Statistic package gebruiken :) Daar heb heb je allemaal classes speciaal voor gemiddelde totalen ed...

ps.1

Code:
protected HashMap<String, List<Double>> map;
het is beter om hier de interfaces (Map,List) te gebruiken ipv de implementaties (HashMap/ArrayList). Als je later besluit om toch een LinkedList te kiezen hoef je dit op veel minder plaatsen aan te passen.

ps.2

Je hebt inderdaad een Map nodig en geen Set.. ;)
 
Als ik het goed lees zijn we er bijna, maar nog niet helemaal ;).

Volgens mij (ik kan het hier helaas niet testen) krijg ik uit bovenstaande de key uit de map (dus de string die erin gezet wordt) en de size van de map.get(key).
Dat is dan toch het aantal key's in de map en niet in de list ?
Vervolgens heb ik ook nog de waarde nodig van de double's die in de List staan, hoe haal ik die dan op.

iig erg bedankt voor het meedenken. :D
 
We zijn er helemaal ;)..

map.size() geeft het aantal elementen in de Map. map.get(key) geeft de array terug en dus map.get(key).size() de aantal elementen in de array.. (de tweede for doorloopt de elementen in de array..

Ik heb de code iets aangepast zodat het duidelijker wordt..
Code:
for (String key : map.keySet()) {
	 double totaal = 0;
	List<Double> lijst = map.get(key);
	for (double getal : lijst) {
		totaal+= getal;
	}
System.out.println("Key: " + key + " aantal in list" + lijst.size() + " totaal: " + totaal);}
}

Het maakt hier ook gebruik van 'autoboxing' om van Double naar double te gaan..
ArrayList bevat Double maar dan kan je niet eenvouding mee rekenen,en gebruik dus de automatische conversie naar double. waar je wel mee kan rekenen.
 
een set is de verzameling keys uit een map, je hebt dus wel degelijk een set nodig. oh hey kijk eens aan map.keySet() return een set en geen map
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan