HashMap.keySet().toArray()

jeipack

Erfahrenes Mitglied
Hi Forum
Ich habe eine HashMap, der ich auch angebe welche Objekte darin vorkommen können. Als Key kann nur ein Integer angenommen werden:
Java:
Map<Integer, Double> mapBaujahr = new HashMap<Integer, Double>();
Später brauche ich die Keys, am besten auch als Integer. So dass ich sie in einer Schlaufe durchlaufen kann. Versucht habe ich es über ein Array:
Java:
Integer[] jahre =(Integer[])mapBaujahr.keySet().toArray();

Allerdings wirft das eine java.lang.ClassCastException.
Zwei Fragen:
1. wieso soll ich das Array eigentlich casten? Eigentlich ist doch schon von Anfang an klar dass es nur Integers beinhalten kann.
2. So casten funktioniert ja nicht, gäbe es eine Möglichkeit schnell eine Integer-Liste (Array, Interator, egal) daraus zu bekommen?
(In der zwischenzeit mache ich einfach ein Object[] Array und caste den jeweiligen Wert halt immer dort wo ich es gerade brauch)

---

Gibt es eigentlich ein alternatives Konstrukt zum eben das machen was ich hier machen will:
eine Liste in der man via Key einen Wert hinterlegen, ABER auch schnell alles Keys rausholen kann (eine HashMap ist dafür ja eigentlich nicht gedacht).


Gruss und schonmal Danke :)
jeipack

PS: Benutze Java 5
 
Zuletzt bearbeitet:
Hallo jeipack,

Später brauche ich die Keys, am besten auch als Integer. So dass ich sie in einer Schlaufe durchlaufen kann. Versucht habe ich es über ein Array:
Java:
Integer[] jahre =(Integer[])mapBaujahr.keySet().toArray();

Seit Java 1.5 ist folgendes möglich:

Java:
HashMap<Integer, Double> mapBaujahr = new HashMap<Integer, Double>();

for(Integer jahr : mapBaujahr.keySet()) {
   System.out.println("Jahr: " + jahr);
   // ...
}

Dies erspart dir so einige Probleme bzw. Aufwände.

Allerdings wirft das eine java.lang.ClassCastException.
Zwei Fragen:
1. wieso soll ich das Array eigentlich casten? Eigentlich ist doch schon von Anfang an klar dass es nur Integers beinhalten kann.

Hier ein paar Beispiele, wie es gemacht wird: http://www.exampledepot.com/egs/java.util/coll_GetArrayFromVector.html

2. So casten funktioniert ja nicht, gäbe es eine Möglichkeit schnell eine Integer-Liste (Array, Interator, egal) daraus zu bekommen?
(In der zwischenzeit mache ich einfach ein Object[] Array und caste den jeweiligen Wert halt immer dort wo ich es gerade brauch)

Siehe meine erste Möglichkeit. Geht mit allen Klassen, welche das Interface Iterable implementieren.

Gibt es eigentlich ein alternatives Konstrukt zum eben das machen was ich hier machen will:
eine Liste in der man via Key einen Wert hinterlegen, ABER auch schnell alles Keys rausholen kann (eine HashMap ist dafür ja eigentlich nicht gedacht).

Warum sollte eine HashMap für diesen Fall nicht gedacht sein? Ich wüsste keine bequemere Klasse um dies möglich zu machen. :)

Viele Grüße,
MAN
 
Hey MAN

Echt klasse, wieder was dazugelernt :)

Klappt super:
Java:
void testIterable() {
    HashMap<Integer, String> mymap = new HashMap<Integer, String>();
    mymap.put(1, "eins");
    mymap.put(2, "zwei");
    mymap.put(3, "drei");
    
    for(Integer i : mymap.keySet()) {
      System.out.println(i +": "+mymap.get(i));
    }
  }
Gibt als Ausgabe:
Code:
2: zwei
1: eins
3: drei

Gibt es eine Möglichkeit "Iterable's" gleich zu sortieren?
 
Morgen

So klappts mit dem sortieren:
Java:
  void testIterable() {
    HashMap<Integer, String> mymap = new HashMap<Integer, String>();
    mymap.put(4, "vier");
    mymap.put(1, "eins");
    mymap.put(2, "zwei");
    mymap.put(3, "drei");

    for(Integer i : new TreeSet<Integer>(mymap.keySet())) {
      System.out.println(i +": "+mymap.get(i));
    }
  }
 
Ich persönlich bevorzuge beim Iterieren entrySet(). Damit wird IMHO der Code in der SChleife etwas besser lesbar:

Java:
for (Entry<Integer, String> entry : map.entrySet()) {
 System.out.println(entry.getKey() + ": " + entry.getValue());
}

Gruß
Ollie
 
Hallo,

... aber vorsicht. entrySet macht manchmal seltsame Dinge... ;-)
Java:
/**
 * 
 */
package de.tutorials;

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

/**
 * @author Thomas.Darimont
 * 
 */
public class IdentityHashMapFun {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Map m = new IdentityHashMap();
		m.put("a", 1);
		m.put("b", 2);
		m.put("c", 3);
		
		Set set = new HashSet(m.entrySet());
		System.out.println(set.size());
		System.out.println(set);
	}
}

Gruß Tom
 
hi. ich weiss, uralter thread, aber google brachte mich hierhin ;) ich würd gern über eine hashmap iterieren. aber nicht nur das, die values sind obendrein auch noch arrays (String []). über die hashmap selber kann ich ja noch iterieren, aber wie komme ich an meine array-elemente ran? ich müsste jedwede kombination der array-elemente haben. geht sowas überhaupt mit hashtables?
hier mal mein code:
Java:
import java.io.BufferedReader; 
import java.io.FileReader; 
import java.util.*; 
 
public class HashMapEx { 
 
    public static void main(String[] args) { 
        HashMap<String, String[]> metadata = new HashMap<String, String[]>();
 
        try { 
            // Opening file 
            // change "/Users/anyexample/input.txt" to path to your test file  
            BufferedReader in = new BufferedReader(new FileReader("test.txt"));
            // string buffer for file reading   
            String str;
 
            // reading line by line from file    
            while ((str = in.readLine()) != null) { 
                //split string from metafile at "="
				
				String[] splitarray = str.split("\\=");
				//remove whitespaces from inputfile...
				
				splitarray[0] = splitarray[0].trim();
				splitarray[1] = splitarray[1].trim();
				
				//test if splitted string starts with "generic"
				//here also the hashmap is filled with the data from generics!
				if (splitarray[0].startsWith("generic")){
					String[] subsplit1 = splitarray[0].split("\\s+");
					splitarray[0] = subsplit1[1];
				
				
					// wenn mehrere werte pro generic, muessen wir die separieren!
					String[] subsplit2 = splitarray[1].split("\\,");
					//splitarray[1] = subsplit2;
					for (int index=0; index<subsplit2.length; index++){
							System.out.println(splitarray[0] + " " + subsplit2[index]);
					}
					// fill our hashmap with the wanted data...
					metadata.put(splitarray[0], subsplit2);
				//}
				}
				
			}
			System.out.println("found " + metadata.size() + " generics");
			for(String generic : metadata.keySet()) {
      				System.out.println(generic +": "+metadata.get(generic));
    			}
             
            // Close buffered reader 
            in.close();
        } catch (Exception e) { 
            e.printStackTrace();
	    System.out.println("Datei nicht gefunden!");
            System.exit(1);
        } 
} 
}
 
Hi dodger,

so wie du auch über das Entry-Set iterierst, kannst du auch über Arrays iterieren:


Java:
import java.util.HashMap;
import java.util.Map.Entry;

public class IterateExample {
	public static void main(String[] args) {
		HashMap<String, String[]> metadata = new HashMap<String, String[]>();
//		...
		System.out.println("found " + metadata.size() + " generics");
//		...
		for(Entry<String, String[]> entry : metadata.entrySet()) {
			for(String value : entry.getValue()) {
				System.out.println(entry.getKey() + ": " + value);
			}
		}
	}
}

Viele Grüße,
MAN
 
Hi. schonmal danke für die antwort, compiled nur leider nicht :(
cannot find symbol
symbol : class Entry
location: class HashMapEx
for(Entry<String, String[]> entry : metadata.entrySet()) {
^
1 error
 
Zurück