Archief - [PROG][JAVA] HashMap en cast-probleem

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

ipodtouch_rules

Legacy Member
Beste mede-forummers,

ik zit weer eens met een klein probleem en ik hoop te kunnen rekenen op u hulp.

stel ik heb records in een HashMap

Code:
int[] a={1,2};
int[] b={3,4};
int[] c={5,6};

HashMap<int[],Boolean> hashmap=new HashMap<int[],Boolean>(3);

hb.put(a,true);
hb.put(b,false);
hb.put(c,false);

Iterator it=hashmap.keySet().iterator();

    while(it.hasNext()){

        Boolean booleanWrapped=(Boolean) it.next();
        boolean booleanNormaal=booleanWrapped.booleanValue();
        System.out.println(""+booleanNormaal);

     }

de bedoeling is dat het mij de opgeslagen booleans teruggeeft.
Compileren doet het wel, maar daarna krijgt ik een error dat zegt
dat er iets misloopt bij het casten. Weet iemand wat er hier aan scheeelt ?

mvg, Michael

SharkyXTS

Legacy Member
http://java.sun.com/javase/6/docs/api/java/util/HashMap.html

HashMap.keyset() geeft je een lijst van de keys terug, je int[]'s dus. Oplossing: maak gebruik van de methode values() (zie link) om alle booleans te verkrijgen.

Tip: itereren kan dan ook handiger (code niet getest, maar ga ervan uit dat ze werkt :p):
Code:
    for (Boolean value : hashmap.values()) {
        boolean booleanNormaal = value.booleanValue();
        System.out.println(booleanNormaal);
     }

forloRn_

Legacy Member
By the way: als je generics gebruikt, hoef je helemaal niet te casten. Type checking at compile-time is eigenlijk de reden waarom ze die dingen hebben uitgevonden. :p Geeft je compiler geen warning?

ipodtouch_rules

Legacy Member
ik weet niet waarover je het hebt :unsure:
maar als het tijd en moeite bespaart zal ik er eens achter zoeken.

Michael

ipodtouch_rules

Legacy Member
nu zit ik weer met een lastig probleem; :help:
ik wacht zeker niet op een oplossing, maar kan iemand mij een tip geven in welke richting ik moet zoeken.
Code:
    public Boolean hashmaptestINTEGER(){
        HashMap<Integer[],Boolean> hb=new HashMap<Integer[],Boolean>();

    Integer[] reeks={0,1,2};


    hb.put(reeks,true);


    Integer[] temp=new Integer[3];
    temp[0]=0;
    temp[1]=1;
    temp[2]=2;
    return hb.get(  (Integer[])  temp); // deze resulteert in een nullpointerException
}

null zou betekenen dat er geen afbeelding gevonden is van key naar value, maar ik daarvoor de reeks toch opgeslagen ?
De bedoeling is om true terug te krijgen. Hierbij wil ik gebruik maken van een tijdelijke Integer[].

please help, Michael

forloRn_

Legacy Member
Dit deed je vóór Java 1.5:

Code:
		Map hashmap1 = new HashMap();

		Integer[] a= {1, 2};
		Integer[] b= {3, 4};
		Integer[] c= {5, 6};

		hashmap1.put(a, Boolean.TRUE);
		hashmap1.put(b, Boolean.FALSE);
		hashmap1.put(c, Boolean.FALSE);

		for (Iterator it = hashmap1.values().iterator(); it.hasNext();)
			System.out.println(((Boolean)it.next()).booleanValue());

Dit doe je vanaf Java 1.5 (generics, autoboxing en nieuwe for-loop):

Code:
		Map<Integer[], Boolean> hashmap2 = new HashMap<Integer[], Boolean>();

		hashmap2.put(a, true);
		hashmap2.put(b, false);
		hashmap2.put(c, false);

		for (Iterator<Boolean> it = hashmap2.values().iterator(); it.hasNext();)
			System.out.println(it.next().booleanValue());

		// kortere versie
		for (Boolean value: hashmap2.values())
			System.out.println(value.booleanValue());

En de reden waarom je in de laatste post je element niet terugvindt in de hashmap, is omdat een gewone array equals() en hashcode() van Object gebruikt:

Code:
		System.out.println("uh oh: " + (reeks.hashCode() == temp.hashCode()));
		System.out.println("uh oh: " + reeks.equals(temp));

output:

Code:
uh oh: false
uh oh: false

Een array als key van een HashMap vind ik sowieso een rare keuze.

ipodtouch_rules

Legacy Member
bedankt, met integers was het eingelijk omslachtig, dus heb ik nu maar een string-representaite gebruikt. Zo is het eigenlijk beter

mvg, Michael
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan