Hash in Array?

wachteldonk

Erfahrenes Mitglied
Hallo,

ich habe folgenden Code erzeugt

Code:
    public HashMap c = new LinkedHashMap ();


    public void getConfig() {
        ArrayList data = new ArrayList();
        for (int i = 0; i < 10; i++) {
            c.clear();
            c.put("Marke", "Ford");
            c.put("Typ", "Fiesta");
            c.put("PS", "80");
            data.add(c);
        }
      System.out.println(data.get(0).?);


Wie komme ich nun an die innere Struktur also dem c im data?

Ich habe die Stelle mal mit ? makiert wo ich nicht weiter komme. Fast ganz am Ende:)

Bin noch recht neu in Java:)
 
Zuletzt bearbeitet:
Hallo entweder mit TypCasting :

Code:
((HashMap)data.get(0)).get("Marke");
System.out.println(((HashMap)data.get(0)).get("Marke"));

oder sollte auch mit Generics gehen, dann kannst du aber nur HashMaps in deinen Array tun
 
Nimm am Besten gleich die generische Variante, macht das Leben gleich viel einfacher.

Was du suchst, ist wahrscheinlich die Funktion get() der HashMap.

Das könnte dann z.B. so aussehen:

Java:
	 public static HashMap<String, String> c = new LinkedHashMap<String, String> ();


	    public static void getConfig() {
	        ArrayList<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();
	        for (int i = 0; i < 10; i++) {
	            c.clear();
	            c.put("Marke", "Ford");
	            c.put("Typ", "Fiesta");
	            c.put("PS", "80");
	            data.add(c);
	        }
	        for (HashMap<String, String> c : data) {
	        	for (String key : c.keySet()) {
	        		System.out.println(key + ": " + c.get(key));
	        	}
	        }
	    }

Gruß,

RoCMe
 
Hallo entweder mit TypCasting :

Code:
((HashMap)data.get(0)).get("Marke");
System.out.println(((HashMap)data.get(0)).get("Marke"));

oder sollte auch mit Generics gehen, dann kannst du aber nur HashMaps in deinen Array tun

Danke,

oder gibt es noch eine andere , einfachere Variante?

Kenne das halt nur von php, VB und Co und da ist sowas teilweise sowas von simpel gelöst:)
 
wachteldonk hat gesagt.:
hatte das Beispiel übersehen aber einfacher? Ich zähle in Summe sogar mehr Zeichen als im ersten Beispiel:)

Gut, wenn du einfacher gleich weniger Zeichen setzt, dann mag das richtig sein ;-)

Mal ganz langsam: In Listen wie z.B. eine ArrayList kann man irgendwas reinstecken. Irgend ein Objekt, zum Beispiel eine Instanz von "Auto".

Java:
ArrayList list = new ArrayList();
Auto meinAuto = new Auto();
list.add(meinAuto);

Das Problem: Wenn du jetzt das Auto wiederhaben willst, bekommst du zunächst erst mal nur ein Objekt. Jetzt musst du Java erst mal sagen, dass du dieses Ding gerne als Auto interpretieren musst, du musst es also casten:

Java:
//aus der Liste holen
Object o = list.get(0);
//in ein Auto "verwandeln"
Auto auto = (Auto) o;

Das ist doch doof! Wenn du weißt, dass du nur Autos in deine Liste steckst, warum solltest du das jedes Mal wieder casten müssen?

Also gibt es Generics. Hier kommen die eckigen Klammern ins Spiel. Mit denen kannst du z.B. angeben, was in deiner Liste drin stehen soll.

z.B. so:
Java:
//eine Liste, in die nur Autos gelegt werden können
ArrayList<Auto> list = new ArrayList<Auto>();
Auto meinAuto = new Auto();
list.add(meinAuto);
...
Auto meinAuto = list.get(0);

Wenn du versuchen würdest, irgendwas anderes als ein Auto in die Liste zu schreiben, würde das eine Exception auswerfen. Eine Auto-Liste kann eben keine Bagger enthalten ;-)

Bei der HashMap wirds noch ein wenig lustiger. Hier kannst du nicht nur sagen, was rein soll, sondern auch, was der Schlüssel sein soll. Du hast Strings als Schlüssel genutzt (z.B. "Marke"), und die eigentlich gespeicherten Werte waren auch Strings ("Ford"), du brauchst also folglich eine HashMap<String, String>.

Soweit klar?

Spiel einfach mal damit rum, in 2 Wochen willst du nie mehr ohne Programmieren ;-)

Noch Fragen? ;)

Gruß,

RoCMe
 
Zuletzt bearbeitet:
Hallo,

hm, vielelicht siehtd er Syntax für mich auch etwas komisch aus weil ich diese eckigen klamemrn nur als Vergleichsoperator und/oder tagbegrenezr kenne.:)

Nochmal dazu:

ArrayList<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();

also das mit den Klammern ist nur ne Art Vorlage/Template und wnen man dieses Vorlagencasting entfernt kommt das dabei raus

ArrayList data = new ArrayList();

Das was ich entfernt habe sagt ihm nur wie die inhalte aussehen müssen?

Wenn das in der Definition schon vorgegeben wurde, warum muss ich das dann hei rnochmal vorgeben?

HashMap<String, String> c

und warum ist der Zahlenwert bei data jetzt zweimal String?! data enthält doch nur Zahlen, oder!
 
Zuletzt bearbeitet:
und warum ist der Zahlenwert bei data jetzt zweimal String?! data enthält doch nur Zahlen, oder!

Nein! data ist eine Liste, die HashMaps enthält. Das ist zwar nicht unbedingt schön, aber damit hast du doch angefangen?! :p
Die Zahlen, die du meinst, geben nur die Position an, an der du in der Liste suchst:
Java:
data.get(0)
Gibt das 1. Element der Liste zurück!

Du hast Recht: Die eckigen Klammern sind so eine Art "Vorlage" - die besagt, dass in diese Liste nur der dort angegebene Datentyp (z.B. "String") eingefügt werden darf.

Dann noch mal zu folgender Zeile:

Java:
ArrayList<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();

Zunächst definierst zu eine Liste "data", in die nur HashMaps gesteckt werden dürfen. Aber nicht irgendwelche HashMaps, sondern nur HashMaps, die als Schlüssel und als Werte nur Strings akzeptieren.
Warum du das jetzt noch mal angeben musst ist schwierig zu erklären. Akzeptier es einfach, oder google ein wenig :)

Gruß,

RoCMe
 
Zurück