ubuntuusers.de

HashMap auslesen (Java)

Status: Gelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

Giesi35

Anmeldungsdatum:
30. Januar 2011

Beiträge: Zähle...

Hallo,

ich habe folgendes Problem. Ich möchte eine Hashmap auslesen, komm allerdings nicht weiter! Die folgende Datenstruktur sieht wiefolgt aus:

1
ArrayList<HashMap<Fish, Integer>>

Desweiteren brauche ich aus Fish nur den Namen des Fisches mit

1
Fish.getName() oder Fish.toString()

Die Integer beschreibt nur die Anzahl der Fische bzw. des Fisches z.B.:

Fischname  Anzahl
Testfisch1 1
Testfisch2 3
Testfisch3 4

Danke

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Abgesehen davon, dass ich diese Datenstruktur so sinnfrei finde: Wo ist jetzt Dein Problem? Du hast halt eine ArrayListe vom Typ HashMap. Greifst Du nun über einen Index auf ein Element zu, hast Du ein HashMap-Objekt. In die get-Methode kannst Du nun ein Fish-Objekt reinstecken und bekommst dann den zugehörigen Integer-Wert zurück.

Giesi35

(Themenstarter)

Anmeldungsdatum:
30. Januar 2011

Beiträge: 164

Die Fishobjekte werden dynamisch erstellt und ich möchte das vom Anfang bis zum Ende der Hashmap alle Objekte durchgegeben werden!

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17599

Wohnort: Berlin

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.util.*;

class Fish {
        // nicht ganz idiomatisch, aber wir wollen den Fisch zum Laufen bringen -schnell. :)
	public String name = "Hai Nehr";
}
		
public class HashFish
{
	public static void main (String args[])
	{
		ArrayList <HashMap <Fish, Integer>> al = new ArrayList <HashMap <Fish, Integer>> ();
		Fish f = new Fish ();
		HashMap <Fish, Integer> hm = new HashMap <Fish, Integer> ();
// wenig Fische i.d. Map, zugegeben ...
		hm.put (f, 7);
// ... und auch nicht mehr Maps i.d. Liste 
		al.add (hm);
		
		for (HashMap <Fish, Integer> map : al)
			for (Map.Entry <Fish, Integer> me : map.entrySet ()) 
			{
				Fish fish = me.getKey ();
				System.out.println ("found: " + fish.name);
			}				
	}
}

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Ich halte die Datenstruktur dennoch für fragwürdig: Bist Du Dir sicher, wie Du einen "Fisch" klassifizierst? Letztlich müsste die Anzahl bei allem bisher gezeigten immer genau eins sein! Ich vermute mal, dass das eben nicht gewünscht ist...

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

Hi,

sei mir nicht bitte nicht böse, ich würde das auch so sehen wie Lysander geschrieben hat. Du verwendest die Hash-Map als einzenes Name-Value-Paar und setzt jedes davon in eine Array-List. Eine HashMap ist aber ein Container für eine Menge an Name-Value-Paaren. Du kannst doch direkt deine Fischnamen und die zugehörigen Zählerstände in der HashMap ablegen.

Dir würde - was ich aus deinem Post so rauslese - vermutlich schon ein

HashMap<String,Integer>

genügen (String für den Fischnamen, Integer für den Zählerstand), weil du ja den Fischnamen als Schlüssel verwendest(?)

Giesi35

(Themenstarter)

Anmeldungsdatum:
30. Januar 2011

Beiträge: 164

Es hat seine Berechtigung und es ist auch sinnvoll. Zum Sinn und Zweck:

Ich erhalte durch Tiefensuche verschiedene HashMaps bzw. in dem Fall Kombinationen von Fischsorten, die nunmal so gespeichert werden! Das ist sinnvoll! Ich habe es nur nicht gepostet, da es irrelevant für das Thema war!

Ich habe das Problem jetzt selber gelöst!

1
2
3
4
5
6
HashMap<Fish, Integer> combination;

for (Map.Entry<Fish,Integer> fishType : combination.entrySet())
{
    // Aktion
}

Edit: String ist kein Ersatz für die Klasse Fish, da dort noch andere Attribute drinne stehen (z.B. Kosten).
Man sollte nicht ohne Hintergrundkenntnisse etwas als "unsinnig" deklarieren!

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

ja, da hast du wieder recht.

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Giesi35 schrieb:

Ich erhalte durch Tiefensuche verschiedene HashMaps bzw. in dem Fall Kombinationen von Fischsorten, die nunmal so gespeichert werden!

Also repräsentiert ein Objekt der Klasse Fish gar keinen einzelnen Fisch, sondern eher eine Fischsorte? Dann wäre ein besserer Klassenname wohl FishType, oder nicht? Sollte dem nicht so sein, bleibt die Struktur eben nicht sinnvoll! 😉

Solltest Du auf die Struktur keinen Einfluss haben, weil ein API das so zurückliefert, könntest Du Dir aber ggf. eine sinnvollere für den weiteren Ablauf ausdenken.

Manchmal kommt man auch um mehrere Mappings nicht herum, etwa:

1
2
3
4
// Vom Fischnamen auf zugehöriges Fish-Objekt schließen
Map<String, Fish> fishtypes = new HashMap<String, Fish>();
// Name auf Anzahl mappen
Map<String, Integer> fishcounts = new HashMap<String, Integer>();

Damit kommst Du über einen String an das Fischobjekt und die Anzahl (Und mittels Fish.getName ja wieder an den Namen, solltest Du "nur" die Objekte haben und damit auch wieder an die Anzahl).

Wie gesagt: Die gezeigte Struktur und Problematik spricht eher dafür, dass es sich bei Fish eher um die Sorte denn um einen speziellen Fisch handelt. Und dann ist der Name eben irreführend, weswegen es erst zu den Nachfragen kam. Zusätzlich könnte man sich dann eben die Liste sparen und nur eine Map einsetzen - denn eine Sorte muss ja über ein eindeutiges Merkmal verfügen.

Sollte dem nicht so sein, ist die gezeigte Struktur unbrauchbar bis hin zu falsch.

Das ist sinnvoll! Ich habe es nur nicht gepostet, da es irrelevant für das Thema war!

Die Relevanz ergibt sich manchmal erst durch die Diskussion 😉 Oftmals behandeln wir XY-Probleme hier, weil der OP auf der falschen Ebene nach einem Problem sucht.

Ich habe das Problem jetzt selber gelöst!

Naja, user unknown hatte die Lösung ja schon gepostet 😉

Man sollte nicht ohne Hintergrundkenntnisse etwas als "unsinnig" deklarieren!

Hat doch auch niemand getan. Es wurde nur hinterfragt, ob die Struktur so sinnvoll ist - eine Beantwortung meiner Frage

Giesi35

(Themenstarter)

Anmeldungsdatum:
30. Januar 2011

Beiträge: 164

Ich habe es zu spät gemerkt, dass user unknown mir schon die Antwort gegeben hatte! Danke nochmals dafür!

Das Programm klappt jetzt auch... ich möchte nochmal den genaueren Sinn hinter dieser etwas "fragwürdigen" Konstrukt geben:

Der Klassenname Fish representiert jeweils eine Fischsorte mit Namen und Preis.
Die HashMap sorgt dafür, dass man jeden Fisch eine Anzahl zuordnen kann bzw. wird diese innerhalb einer Methode hochgezählt.

Das würde ja schonmal die HashMap<Fish, Integer> erklären!
Zum Teil mit der ArrayList<HashMap>:

Ich erhalte durch Tiefensuche verschiedenste (bzw. alle) Kombination der Fische zu einer gegebenen Summe. Jegliche Kombinationen werden in dieser ArrayList gespeichert. Mag sein, dass dies nicht die beste Lösung zu dem gegebenen Problem ist, allerdings bin ich auch nicht der Java-Programmierer schlechthin 😀. Das Programm hat seine Aufgabe voll erfüllt!

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Also doch eher FishType 😉

Den Teil mit den Kombinationen kapiere ich noch nicht! Du erhältst also so etwas in der Art? (JSON-Notation)

1
2
3
4
5
6
7
[
  {Forelle-obj: 6},
  {Scholle-obj: 3},
  {Forelle-obj: 4},
  {Forelle-obj: 10},
  {Barsch-obj: 32}
]

Sprich, Du hast durchaus X-mal dasselbe Fischtyp-Objekt, welches mit einer anderen Anzahl verknüpft ist? Wenn dem so ist: Welche Information kann man daraus ableiten?

Giesi35

(Themenstarter)

Anmeldungsdatum:
30. Januar 2011

Beiträge: 164

Lysander schrieb:

... Sprich, Du hast durchaus X-mal dasselbe Fischtyp-Objekt, welches mit einer anderen Anzahl verknüpft ist? Wenn dem so ist: Welche Information kann man daraus ableiten?

Nein...daher die HashMap... ich mach es mal an deinem Beispiel fest:

HashMap<Fish, Integer>

Forelle, 20
Scholle, 3
Barsch, 32

Jeweils immer nur ein Objekt, nur die Integer (also die Anzahl) wird hochgezählt. Doppelt Forelle' oder 'Scholle' kommt nicht in einer HashMap vor! Das wird durch Typ-Überprüfung abgefangen und führt zum Hochzählen des Counters.

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Ah! Jetzt habe ich es 💡

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[
  {
    Forelle-obj: 6,
    Scholle-obj: 3
  {
    Forelle-obj: 4,
    Barsch-obj: 32
  },
  {
    Forelle-obj: 10
  }
]

So in der Art?

Die Verwirrung entstand dadurch, dass Du oben die Liste mit angegeben hast, Deine Beispielausgabe sich aber nur auf eine Map bezog!

Giesi35

(Themenstarter)

Anmeldungsdatum:
30. Januar 2011

Beiträge: 164

Genau! 😉 Im meinen Kopf war es logisch aufgebaut 😀. Den es ging mir ja um auslesen einer Map... nicht um die Liste 😀

Antworten |