# BlueJ: Anfängerprojekt mit HashMap



## BillyBob (28. Nov 2008)

Hallo zusammen 

Ich muss folgende Aufgabe berarbeiten: 



> *Aufgabe: Lagersystem *
> 
> a) Erstellen Sie zunächst die Klasse Produkte
> 
> ...



Die Aufgabe a) war kein Problem. Aber bei b) bin ich mir nicht ganz sicher... Ich habe meinen Code unten einmal gepostet (inkl. der Aufgabe a)... Muss man diese Aufgabe mit einem HashMap lösen oder gibt es da noch andere Möglichkeiten? Ich verstehe den Zusammenhang von a und b nicht ganz... man hat ja eigentlich in a bereits Produkte erzeugt oder nicht? 

Vielen Dank für Eure Hilfe!


```
public class Produkte
{
    private String hersteller;
    private String kommentar;
    private String artikelnummer;
    private int anzahl;

  
    public Produkte(String hersteller, String kommentar, String artikelnummer)
    {
        this.hersteller = hersteller;
        this.kommentar = kommentar;
        this.artikelnummer = artikelnummer;
        anzahl = 0;
    }


    public void erhoehen(int anzahl)
    {
        this.anzahl += anzahl;
    }
    
    public void ausbuchen(int anzahl)
    {
        this.anzahl -= anzahl;
    }
}
```


```
import java.util.ArrayList;


public class Produktverwaltung
{
    private ArrayList<Produkte> prod;


    public Produktverwaltung()
    {
        prod = new ArrayList<Produkte>();
    }

 
    public void erfasseMedium(Produkte Produkt)
    {
        prod.add(Produkt);
    }


}
```
[/code]


----------



## SlaterB (28. Nov 2008)

> Muss man diese Aufgabe mit einem HashMap lösen oder gibt es da noch andere Möglichkeiten? 

du kannst sie auch in eine Liste schreiben und bei Rückgabe des Produktes zur Artikelnummer die Liste durchlaufen und einzeln vergleichen,
ist technisch machbar aber nicht so schön wie eine Map

> Ich verstehe den Zusammenhang von a und b nicht ganz... 

die Klasse aus b enthält Objekte der Klasse aus a,
welch einfacheren Zusammenhang könnte es geben?

> man hat ja eigentlich in a bereits Produkte erzeugt oder nicht? 

in a hat man eine Klasse geschrieben, nichts erzeugt,

strenggenommen schreibt man in b wieder nur eine Klasse, naja, das wird philosophisch,

stelle dir vor, du hättes im Kunstunterricht in a) ein Auto gemalt und in b) einen Parkplatz mit Autos


----------



## BillyBob (28. Nov 2008)

hallo SlaterB 

Vielen Dank, dass Du Zeit für mein Problem geopfert hast. 

Wie erzeuge ich dann das Objekt in b oder einfacher gesamt, ich erstelle die Instanzen in a und gebe sie dann wieder in die List ein oder ist dies anders gemeint??? Wie würdest Du die Produktverwaltung progammieren??? Ist mein Lösungsvorschlag soweit gut??? 

VIELEN DANK!!!!


----------



## SlaterB (28. Nov 2008)

das Objekt erzeugst du so wie du alle Objekte in Java erzeugst,
prod = new ArrayList<Produkte>(); 
hast du ja schon hinbekommen,

was ist an new Produkt(); dann anders? du musst nur zusätzlich die Parameter des Konstruktors übergeben

> ich erstelle die Instanzen in a und gebe sie dann wieder in die List ein oder ist dies anders gemeint??? 

a und b sind Aufgaben, keine Akteure in deinem Programm..

erstellte Produkte sollst du in der Produktverwaltung aufbewahren,
ob das nun das Einfügen in die Liste oder sonst was bedeutet musst du schon selber entscheiden

> Wie würdest Du die Produktverwaltung progammieren??? 

erstklassig 

> Ist mein Lösungsvorschlag soweit gut???

duchaus, obwohl ne Map schöner wäre als ne Liste, 
kann aber sein dass du das noch nicht kennen musst


----------



## Gast (29. Nov 2008)

Hallo... 

Danke für deine Ausführungen. 

Habe jetzt alles als HashMap umgeschrieben. Mir ist aber immer noch unklar, wie ich bei newProduct() eines Produkt erstellen kann und dies noch zusätzlich in die HashMap ablegen kann???


----------



## SlaterB (29. Nov 2008)

das sind zwei einzelne Schritte,
der erste hat mit new Product() zu tun, was ist daran unklar?
der zweite hat mit der put-Methode der Map zu tun, was ist daran unklar?


----------



## BillyBob (29. Nov 2008)

ok... danke... es funktioniert glaube ich langsam... (sehr langsam).... :lol: 

Ich arbeite in BlueJ und normal werden ja unten alle Instanzen aufgeführt, führt es bei dieser Methode keine Instanzen vom Produkt auf?? Sind die im Hintergrund gespeichert? 


Beim Print Out der HashMap (nach Eingabe der Artikelnummer), kommt jetzt eine Speicheradresse (z.B. Produkt@94af2f). Mit welchem Befehl kann ich diese "mappen" damit alle Datenfelder meines Produktes angezeigt wird?


----------



## SlaterB (29. Nov 2008)

> Ich arbeite in BlueJ und [..]

da bin ich überfragt

> Beim Print Out 

entweder

System.out.println(produkt.getHersteller() + ..);

oder 
System.out.println(produkt.getKompletteBeschreibungAlsString());

oder
System.out.println(produkt);

wenn die Standard-Methode
public String toString() {
}
ordentlich implementiert ist


----------



## BillyBob (30. Nov 2008)

ok danke... habe es hingekriegt.... mit Iterator und toString()

Kann ich mit einem Iterator auch eine Methode aus Produkt für jeden Datensatz bzw. bestehendes Datenset durchlaufen... ich habe anstatt den Print-Befehl... die Methode eingefügt, das geht aber irgendwie nicht... 

Ich würde gerne alle Produkte durchlaufen und wenn ein Produkt die Anzahl > 40 hat ein boolean True setzen bei Datenfeld Aktion... 

Die Methode in der Klasse Produkt habe ich bereits mit einer IF-Bedingung geschrieben...


----------



## SlaterB (30. Nov 2008)

> Kann ich mit einem Iterator auch eine Methode aus Produkt für jeden Datensatz bzw. bestehendes Datenset durchlaufen...

ja

> das geht aber irgendwie nicht... 

Code posten


----------



## BillyBob (30. Nov 2008)

In der Klasse Produkt:

```
public void Aktion()
    {
        if(Anzahl >40) {
            aktion = true;
        } 
        else {
            aktion = false;
        }

    }
```

In der Klasse Produktverwaltung:

```
public void aktionAufrufen(){ 
      Iterator it = produktliste.keySet().iterator(); 
      while (it.hasNext()) { 
      String key = (String)it.next(); 
      
             Produkt.Aktion();
}
```


----------



## SlaterB (30. Nov 2008)

was soll denn 
>  Produkt.Aktion(); 
bewirken?

eine nichtstatische Methode kann man doch nicht an der Klasse aufrufen,
du schreibst doch auch produktliste.keySet();
und nicht HashMap.keySet()?

aller unterste Grundlagen, bevor man überhaupt an so komplizierte Dinge wie HashMaps denken kann..

mit dem key holst du dir das Produkt:
Produkt p = map.get(key);
und an p kannst du Methoden aufrufen:
p.Aktion();

Methoden klein schreiben! ganz einfache Regel

du könntest auch direkt das Set map.values() durchlaufen,
dann musst du nicht mit Keys hantieren


----------



## BillyBob (30. Nov 2008)

langsam kommt das ganze in die gänge... 

leider habe ich noch nicht viel ahnung von java, aber dies ist halt so, wenn einem im unterricht vorgezeigt wird, wie man einen papierflieger erstellt und man nachher einen a380 erschaffen muss ;-) 

noch eine frage:  *sorry*... gibt es eine möglichkeit, dass man duplikate nur einmal auflistet, d.h. alle hersteller auflistet aber duplikate nicht zulässt? 

meine idee... alle hersteller in ein hashset und dann dieses hashset auslesen.... aber da gibt es sicherlich vom profi bessere und schönere lösungsmöglichkeiten?! 
gruss & danke


----------



## SlaterB (30. Nov 2008)

HashSet ist sehr professionel, und entschuldigen muss sich niemand


----------



## Gast (12. Dez 2008)

Hallo BillyBob

Mich würde es interessieren, wie du nun die Aufgabe gelöst hast. Könntest du bitte deine vollständige Lösung reinstellen. 

Merci


----------

